Verificar Valores de Compromisso do Pedersen

O Oracle Blockchain Platform Digital Assets Edition usa os compromissos da Pedersen para garantir o sigilo e a imutabilidade. As APIs a seguir podem ajudar a verificar os compromissos Pedersen em relação aos valores reais de texto bruto.

No Oracle Blockchain Platform, os dados podem ser persistidos no banco de dados de histórico avançado conectando-se a um Oracle Database. Contas e transações, que são armazenadas como pares de chave/valor no banco de dados de estado, podem ser rastreadas ao longo do tempo no banco de dados de histórico avançado. No modo confidencial, as contas e as transações são armazenadas em duas partes, privada e pública, na tabela de histórico no banco de dados de histórico avançado.

Todos os dados, públicos e privados da organização, estão disponíveis na tabela de histórico do banco de dados de histórico avançado. O nome da tabela usa o seguinte formato: <obp_instance_name>_<channel_name>_hist. Por exemplo, CentralBank_default_hist.

Dados da Conta Pública (Banco de Dados do Estado)
  • Armazenado sob o ID do chaincode: <chaincode_name>
  • Acessível a todos os participantes da rede
  • Propriedades gerais da conta, como org_id, token_name, balance/onhold_balance (como compromissos Pedersen) e outros metadados não confidenciais
Dados de Conta Privada (Coleta de Dados Privados)
  • Armazenado sob o ID do chaincode: <chaincode_name>$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
  • Acessível somente à organização que possui a coleta de dados privada
  • Campos confidenciais, como balance/onhold_balance (valores brutos), balanceBlindingFactor, onHoldBalanceBlindingFactor e limites diários
Dados de Transação Pública (Banco de Dados Estadual)
  • Armazenado sob o ID do chaincode: <chaincode_name>
  • Acessível a todos os participantes da rede
  • Propriedades gerais da conta, como IDs de contas do remetente e do destinatário, from_account_balance/from_account_onhold_balance/to_account_balance/to_account_onhold_balance/valores de transação (como compromissos Pedersen) e outros metadados não confidenciais
Dados de Transação Privada (Coleta de Dados Privados)
  • Armazenado sob o ID do chaincode: <chaincode_name>$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
  • Acessível somente à organização que possui a coleta de dados privada
  • Campos confidenciais como from_account_balance/from_account_onhold_balance/to_account_balance/to_account_onhold_balance/valores de transação (valores brutos) e os fatores de ocultação correspondentes

APIs de Compromisso Pedersen

Você pode usar as seguintes APIs, que estão incluídas no arquivo controlador do chaincode, para verificar e trabalhar com os compromissos Pedersen.

generateCommitment
Este método gera um compromisso de Pedersen para um valor especificado e fator de ocultação. Esse método só pode ser chamado por uma Token Admin ou Org 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;
 }
Parâmetros:
  • value: string – O valor numérico para o qual se gera o compromisso de Pedersen.
  • blinding_factor: string – O número aleatório usado para gerar o compromisso de Pedersen.
Retorna:
  • Um valor de hash, que é o compromisso de Pedersen para o valor especificado e fator de ocultação.
Exemplo de Valor de Retorno:
"0212f6b676da244eee000a9106060cf3a3a4bb5a9b61be23dd467e557156c40be8"
addCommitment
Este método adiciona dois valores de hash de compromisso Pedersen especificados. Como os compromissos de Pedersen são homomórficos, eles suportam a realização de operações matemáticas, como adição e subtração de compromissos, preservando as relações entre os valores subjacentes. Esse método só pode ser chamado por uma Token Admin ou Org 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;
 }
Parâmetros:
  • value1: string – O primeiro valor de hash de compromisso Pedersen a ser adicionado.
  • value2: string – O segundo valor de hash de compromisso Pedersen a ser adicionado.
Retorna:
  • Um valor de hash, que é o compromisso Pedersen para a soma dos dois valores de compromisso Pedersen especificados.
Exemplo de Valor de Retorno:
"03a9c138b76e7d56f799108a46f665f53a42f55008b31e0fec071019aa5c37344a"
subCommitment
Este método subtrai o segundo valor de hash de compromisso Pedersen especificado do primeiro. Como os compromissos de Pedersen são homomórficos, eles suportam a realização de operações matemáticas, como adição e subtração de compromissos, preservando as relações entre os valores subjacentes. Esse método só pode ser chamado por uma Token Admin ou Org 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;
 }
Parâmetros:
  • value1: string – O primeiro valor de hash de compromisso Pedersen na subtração (o minuend).
  • value2: string – O segundo valor de hash de compromisso Pedersen a ser subtraído do primeiro (o subtrahend).
Retorna:
  • Um valor de hash, que é o compromisso Pedersen para a diferença dos dois valores de compromisso Pedersen especificados.
Exemplo de Valor de Retorno:
"0212f6b676da244eee000a9106060cf3a3a4bb5a9b61be23dd467e557156c40be8"

Verificando Saldos de Conta e Em Retenção

  1. Use a consulta a seguir para obter o compromisso de Pedersen do saldo, que são dados 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;
  2. Use a consulta a seguir para obter o fator de saldo e ocultação da coleta de dados 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;
  3. Adicione o método generateCommitment, definido anteriormente, ao arquivo do controlador localizado na pasta src (src/controller/<Chaincode_name>.controller.ts).
  4. Informe os valores balance (como value) e blinding_factor (como blinding_factor) da segunda etapa para o método generateCommitment.
  5. Verifique se o valor balance_commitment da primeira etapa corresponde à saída do método generateCommitment.
  6. Para verificar um saldo em espera, repita estas etapas para o compromisso Pedersen onhold_balance e os valores onhold_balance e onHoldBalanceBlindingFactor.

Verificando Quantidades da Transação

  1. Use a consulta a seguir para obter o compromisso Pedersen da quantidade, que são dados públicos.
    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;
    O texto a seguir mostra um exemplo de consulta.
    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;
    O texto a seguir mostra um exemplo de resposta.
    quantity_commitment
    036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63
  2. Use a consulta a seguir para obter a quantidade e o fator de ocultação da coleta de dados privada.
    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;
    O texto a seguir mostra um exemplo de consulta.
    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;
    O texto a seguir mostra um exemplo de resposta.
    quantity blinding_factor
    100 17721346708393996000
  3. Adicione o método generateCommitment, definido anteriormente, ao arquivo do controlador localizado na pasta src (src/controller/<Chaincode_name>.controller.ts).
  4. Informe os valores quantity (como value) e blinding_factor (como blinding_factor) da segunda etapa para o método generateCommitment.
  5. Verifique se o valor quantity_commitment da primeira etapa corresponde à saída do método generateCommitment.

Auditando Saldos de Contas

Depois de obter os valores atuais balance_commitment e balance e o fator de ocultação da conta, conforme descrito anteriormente, você poderá validar esses valores em relação ao histórico de transações.
  1. Use o método getAccountTransactionHistoryWithFiltersFromRichHistDB para recuperar todas as transações da conta. Cada transação tem um ID de transação exclusivo e as entradas correspondentes de quantity_commitment (no banco de dados de estado) e fator de quantidade e ocultação (na coleta de dados privada).
  2. Siga as etapas anteriores para verificar cada quantidade de transação e garantir que os dados públicos e privados sejam sincronizados. Os exemplos a seguir mostram transações e os valores usados nos cálculos das etapas de verificação anteriores.
    Transação 1
    otransaction~d209ff46dc46f4adb42f0002377507fe995b32bc618ac919eba49141cf1b8008
    Valores das etapas de verificação:
    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 
    Transação 2
    otransaction~862aa9d9e877d3ea209b87299ab5b12c13ed5ce43d1cf1b934043c1dd02f58f6
    Valores das etapas de verificação:
    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
    Transação 3
    otransaction~5112f576c94c2d23c342479bfa37e34612414b3258a64b43cf51b920f4ff5868
    Valores das etapas de verificação:
    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. Repita a lista ordenada de transações na ordem em que ocorreram e calcule os totais em execução de cada propriedade. Para cada transação, execute os passos a seguir.
    1. Se a transação for um crédito (adição), combine a propriedade quantity_commitment usando o método addCommitment. Se a transação for um débito (subtração), combine a propriedade quantity_commitment usando o método subCommitment.
    2. Se a transação for um crédito, adicione a propriedade quantity. Se a transação for um débito, subtraia a propriedade quantity.
    3. Se a transação for um crédito, adicione a propriedade blinding_factor. Se a transação for um débito, subtraia a propriedade blinding_factor.
    Os exemplos a seguir mostram o processamento de compromissos, quantidade e fator de ocultação.
    Compromissos do processo
    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"
    Quantidade do processo
    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
    Fator de ocultação do processo
    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. Depois de processar todas as transações, verifique se as seguintes afirmações são verdadeiras.
    • O valor quantity_commitment corresponde ao valor Account.balance_commitment atual
    • O valor quantity corresponde ao valor Account.balance atual
    • O valor blinding_factor corresponde ao valor Account.blinding_factor atual