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
- Armazenado sob o ID do chaincode: <chaincode_name>
- 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
- Armazenado sob o ID do chaincode: <chaincode_name>
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
ouOrg Admin
. -
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
ouOrg Admin
. -
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
ouOrg Admin
.
Verificando Saldos de Conta e Em Retenção
- 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;
- 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;
- Adicione o método
generateCommitment
, definido anteriormente, ao arquivo do controlador localizado na pastasrc
(src/controller/<Chaincode_name>.controller.ts
). - Informe os valores
balance
(comovalue
) eblinding_factor
(comoblinding_factor
) da segunda etapa para o métodogenerateCommitment
. - Verifique se o valor
balance_commitment
da primeira etapa corresponde à saída do métodogenerateCommitment
. - Para verificar um saldo em espera, repita estas etapas para o compromisso Pedersen
onhold_balance
e os valoresonhold_balance
eonHoldBalanceBlindingFactor
.
Verificando Quantidades da Transação
- Use a consulta a seguir para obter o compromisso Pedersen da quantidade, que são dados públicos.
O texto a seguir mostra um exemplo de consulta.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 resposta.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
- Use a consulta a seguir para obter a quantidade e o fator de ocultação da coleta de dados privada.
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 "<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 resposta.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
- Adicione o método
generateCommitment
, definido anteriormente, ao arquivo do controlador localizado na pastasrc
(src/controller/<Chaincode_name>.controller.ts
). - Informe os valores
quantity
(comovalue
) eblinding_factor
(comoblinding_factor
) da segunda etapa para o métodogenerateCommitment
. - Verifique se o valor
quantity_commitment
da primeira etapa corresponde à saída do métodogenerateCommitment
.
Auditando Saldos de Contas
Depois de obter os valores atuaisbalance_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.
- 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 dequantity_commitment
(no banco de dados de estado) e fator de quantidade e ocultação (na coleta de dados privada). - 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.
- 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.
- Se a transação for um crédito (adição), combine a propriedade
quantity_commitment
usando o métodoaddCommitment
. Se a transação for um débito (subtração), combine a propriedadequantity_commitment
usando o métodosubCommitment
. - Se a transação for um crédito, adicione a propriedade
quantity
. Se a transação for um débito, subtraia a propriedadequantity
. - Se a transação for um crédito, adicione a propriedade
blinding_factor
. Se a transação for um débito, subtraia a propriedadeblinding_factor
.
- 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
- Se a transação for um crédito (adição), combine a propriedade
- Depois de processar todas as transações, verifique se as seguintes afirmações são verdadeiras.
- O valor
quantity_commitment
corresponde ao valorAccount.balance_commitment
atual - O valor
quantity
corresponde ao valorAccount.balance
atual - O valor
blinding_factor
corresponde ao valorAccount.blinding_factor
atual
- O valor