驗證踏板履約承諾值

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_idtoken_namebalance/onhold_balance (作為 Pedersen 承諾) 以及其他非機密中繼資料
私人帳戶資料 (私人資料收集)
  • 儲存在鏈碼 ID 下:<chaincode_name>$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
  • 只有擁有專用資料收集的組織才能夠存取
  • 敏感欄位,例如 balance/onhold_balance (原始值)、balanceBlindingFactoronHoldBalanceBlindingFactor 和每日限制
公用交易資料 (狀態資料庫)
  • 儲存在鏈碼 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/ 交易金額 (原始值),以及對應的閃爍因子

踏板承諾 API

您可以使用下列 API (包含在鏈碼的控制器檔案中) 來驗證和處理 Pedersen 承諾。

generateCommitment
此方法會產生指定值與盲目的因子的「踏板」承諾。只有 Token AdminOrg 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;
 }
參數:
  • value: string – 產生 Pedersen 承諾的數值。
  • blinding_factor: string – 用來產生 Pedersen 承諾的隨機數字。
傳回值:
  • 雜湊值,即指定值和盲係數的 Pedersen 承諾。
傳回值範例:
"0212f6b676da244eee000a9106060cf3a3a4bb5a9b61be23dd467e557156c40be8"
addCommitment
此方法會新增兩個指定的 Pedersen 承諾雜湊值。由於 Pedersen 承諾是同形的,因此支援執行數學運算,例如增加和減去承諾,同時保留基礎值之間的關係。只有 Token AdminOrg 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;
 }
參數:
  • value1: string – 要新增的第一個 Pedersen 承諾雜湊值。
  • value2: string – 要新增的第二個 Pedersen 承諾雜湊值。
傳回值:
  • 雜湊值,即 Pedersen 對兩個指定 Pedersen 承諾值總和的承諾。
傳回值範例:
"03a9c138b76e7d56f799108a46f665f53a42f55008b31e0fec071019aa5c37344a"
subCommitment
此方法會從第一個值減去第二個指定的 Pedersen 承諾雜湊值。由於 Pedersen 承諾是同形的,因此支援執行數學運算,例如增加和減去承諾,同時保留基礎值之間的關係。只有 Token AdminOrg 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;
 }
參數:
  • value1: string – 減法中的第一個 Pedersen 承諾雜湊值 (次元)。
  • value2: string – 要從第一個 (子實體) 減去的第二個 Pedersen 承諾雜湊值。
傳回值:
  • 雜湊值,即 Pedersen 對兩個指定 Pedersen 承諾值差異的承諾。
傳回值範例:
"0212f6b676da244eee000a9106060cf3a3a4bb5a9b61be23dd467e557156c40be8"

驗證科目與保留餘額

  1. 使用下列查詢取得 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;
  2. 使用下列查詢取得專用資料收集的餘額和連結因子。
    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. 將先前定義的 generateCommitment 方法新增至位於 src 資料夾 (src/controller/<Chaincode_name>.controller.ts) 中的控制器檔案。
  4. balance (作為 value) 和 blinding_factor (作為 blinding_factor) 值從第二個步驟傳送至 generateCommitment 方法。
  5. 確定第一個步驟的 balance_commitment 值與 generateCommitment 方法的輸出相符。
  6. 若要驗證保留餘額,請針對 onhold_balance 踏板承諾與 onhold_balanceonHoldBalanceBlindingFactor 值重複這些步驟。

驗證交易數量

  1. 使用下列查詢取得 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
  2. 使用下列查詢,從專用資料收集取得數量和連結因子。
    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
  3. 將先前定義的 generateCommitment 方法新增至位於 src 資料夾 (src/controller/<Chaincode_name>.controller.ts) 中的控制器檔案。
  4. quantity (作為 value) 和 blinding_factor (作為 blinding_factor) 值從第二個步驟傳送至 generateCommitment 方法。
  5. 確定第一個步驟的 quantity_commitment 值與 generateCommitment 方法的輸出相符。

稽核科目餘額

在取得帳戶目前的實際 balance_commitmentbalance 值和盲點係數之後 (如先前所述),您可以針對交易歷史記錄驗證這些值。
  1. 使用 getAccountTransactionHistoryWithFiltersFromRichHistDB 方法擷取帳戶的所有交易。每個交易都有唯一的交易 ID 和對應的 quantity_commitment 項目 (在狀態資料庫中),以及數量和連結因子 (在專用資料收集中)。
  2. 請依照先前的步驟驗證每筆交易數量,並確定公用與私人資料已同步化。下列範例顯示交易以及先前驗證步驟計算中所使用的值。
    交易 1
    otransaction~d209ff46dc46f4adb42f0002377507fe995b32bc618ac919eba49141cf1b8008
    驗證步驟的值:
    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 
    交易 2
    otransaction~862aa9d9e877d3ea209b87299ab5b12c13ed5ce43d1cf1b934043c1dd02f58f6
    驗證步驟的值:
    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
    交易 3
    otransaction~5112f576c94c2d23c342479bfa37e34612414b3258a64b43cf51b920f4ff5868
    驗證步驟的值:
    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. 依交易發生的順序重複執行交易清單,並計算每個館別的累積總計。針對每筆交易,請完成下列步驟。
    1. 如果交易是貸項 (附加),請使用 addCommitment 方法結合 quantity_commitment 特性。如果交易是借方 (減法),請使用 subCommitment 方法結合 quantity_commitment 特性。
    2. 如果交易是貸項,請新增 quantity 特性。如果交易是借方,則減去 quantity 特性。
    3. 如果交易是貸項,請新增 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
  4. 處理所有交易之後,請檢查下列陳述式是否正確。
    • quantity_commitment 值符合目前的 Account.balance_commitment
    • quantity 值符合目前的 Account.balance
    • blinding_factor 值符合目前的 Account.blinding_factor