验证 Pedersen 承诺值
Oracle Blockchain Platform Digital Assets Edition 使用 Pedersen 承诺来确保保密性和不可变性。以下 API 可帮助根据实际原始文本值验证 Pedersen 承诺。
在 Oracle Blockchain Platform 中,通过连接到 Oracle Database,数据可以持久存储在富历史记录数据库中。帐户和事务作为键/值对存储在状态数据库中,可以随着时间的推移在富历史记录数据库中进行跟踪。在保密模式下,帐户和事务都存储在富历史记录数据库的历史记录表中的私有和公共两部分。
丰富的历史记录数据库的历史记录表中提供了组织的所有公共和专用数据。表名使用以下格式:<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
/交易金额(作为 Pedersen 承诺)和其他非机密元数据
- 私有事务处理数据(私有数据收集)
-
- 存储在链代码 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>
Pedersen 承诺 API
您可以使用链码的控制器文件中包含的以下 API 来验证和处理 Pedersen 承诺。
-
generateCommitment
- 此方法为指定值和致盲因子生成 Pedersen 承诺。此方法只能由
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
Pedersen 承诺以及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
值匹配