机密付款概览

Oracle Blockchain Platform Digital Assets Edition 使用 Pedersen 承诺来确保数据安全。

零知识证明

零知识证明 (ZKP) 是加密协议,让诚实的证明者向验证者展示声明的真相,而不会透露任何其他信息。不诚实的证明者不能使验证者相信虚假陈述是真的。ZKP 确保没有泄露超出索赔有效性的敏感数据。ZKP 可以证明一个秘密值的特定属性,例如确认它在一个范围内或者是某个特定计算的结果,而不会透露该值本身。

Pedersen 承诺

零知识证明取决于承诺计划,其中有人可以承诺某种价值,同时将其隐藏在其他人身上。Oracle Blockchain Platform Digital Assets Edition 使用 Pedersen 承诺。Pedersen 承诺使用称为盲因子的随机值以及椭圆曲线加密来确保保密性和不可变性。Pedersen 承诺是同构的承诺;换句话说,它们支持执行数学操作,例如对承诺的加法和减法,同时保留基础值之间的关系。Pedersen 承诺用于专用事务处理协议、安全的多方计算和匿名凭证系统。

使用机密付款

您可以在事务处理请求中使用 Confidential-Transaction 标头来启用机密付款功能。

在请求中将 Confidential-Transaction 标头设置为 true 时,Oracle Blockchain Platform 中的 REST 代理将生成唯一的随机数(Pedersen 承诺所需的致盲系数)并将其传递到瞬态映射中。这由链代码用来处理输入,并将敏感信息存储在专用数据收集而不是状态数据库中。

事务处理信息

所有令牌操作(帐户创建、铸造、转移、刻录等)都会生成事务处理记录,以便跟踪事务处理历史记录。事务处理数据存储在两个位置:公共分类账(状态数据库)和专用数据收集。对于机密付款,敏感数据仅以明文形式存储在交易所涉组织的私人数据收集中。下表显示任何给定事务处理 ID 的事务处理值存储位置。

公共分类账(状态数据库) 私人数据收集
  • assetType
  • transaction_id
  • token_id
  • from_account_id
  • from_account_balance (encrypted)
  • from_account_onhold_balance (encrypted)
  • from_account_onhold_burn_balance (encrypted)
  • to_account_id
  • to_account_balance (encrypted)
  • to_account_onhold_balance: (encrypted)
  • to_account_onhold_burn_balance (encrypted)
  • transaction_type
  • amount(已加密)
  • timestamp
  • number_of_sub_transactions
  • holding_id
  • sub_transaction
  • sub_transaction_type
  • category
  • description
  • global_transaction_id
  • assetType
  • transaction_id
  • from_account_balance
  • from_account_onhold_balance
  • from_account_onhold_burn_balance
  • to_account_balance
  • to_account_onhold_balance
  • to_account_onhold_burn_balance
  • amount
  • blindingFactor
  • version

令牌账户信息

同样,有关令牌帐户的信息存储在公共分类账和专用数据收集中。下表显示了任何给定令牌账户 ID 的事务处理值存储位置。

公共分类账(状态数据库) 私人数据收集
  • assetType
  • account_id
  • org_id
  • token_type
  • token_id
  • token_name
  • balance(已加密)
  • onhold_balance(已加密)
  • onhold_burn_balance(已加密)
  • application_groups
  • bapAccountVersion
  • assetType
  • account_id
  • user_id
  • balance
  • onhold_balance
  • onhold_burn_balance
  • balanceBlindingFactor
  • onHoldBalanceBlindingFactor
  • onHoldBurnBalanceBlindingFactor
  • max_daily_amount
  • daily_amount
  • max_daily_transactions
  • daily_transactions
  • current_date
以下数据存储在公共分类账中:
  • account_id 键,对于系统中的每个用户都是唯一的。通常是 orgId(MSP ID) 和 userId(用户名或电子邮件)与其他前缀或后缀组合的 SHA-256 散列。
  • 公共分类账存储任何用户的所有账户关键字。用户可以有多个可互换的令牌帐户,每个令牌一个。
  • 标记详细信息存储在 token_typetoken_idtoken_name 字段中。
  • balanceonhold_balance 字段包含 Pedersen 承诺散列,该散列表示存储在专用数据收集中的余额的实际文本值。
以下数据存储在专用数据收集中:
  • account_id 密钥,如前所述。
  • balanceonhold_balance 字段包含这些余额的实际文本值。
  • balance_blinding_factoron_hold_balance_blinding_factor 字段存储用于创建存储在公共分类账中的 balanceonhold_balance 承付款的随机密钥。
  • 每日事务详细信息存储在 max_daily_amountdaily_amountmax_daily_transactionsdaily_transactionscurrent_date 字段中。

具有机密付款的典型操作

在使用机密付款时铸造、转移、暂挂或刻录令牌的工作流包括确保数据完整性的其他步骤。

铸造令牌

要生成标记,具有 minter 角色的用户将调用 issueTokens API。
  1. 在机密付款情况下,issueTokens 方法将 token_id 值作为输入,并且还需要一个盲法系数,该系数与瞬态映射中传递的标记数量一起从 REST 代理发送。
  2. 经过验证后,Pedersen 承诺由致盲因子和令牌的数量生成。
  3. 然后,在公共分类账和专用数据收集中更新总数量。在公共分类账中,代表现有余额的 Pedersen 承诺随着 Pederson 承诺的增加而增加,该承诺代表铸造(发行的)代币的数量。专用数据收集中存储的余额的实际值将相应增加。
  4. 此外,还会更新致盲系数,以便随时使用私有数据收集中的余额和致盲系数来验证存储在公共分类账中的相应承诺。

在组织内传输令牌

要在组织内传输令牌,发送方会调用 transferTokens API。
  1. 在机密付款情况下,transferTokens 方法将 token_id 和可选参数作为输入,并且还需要一个盲法系数,该系数与接收方的 userIdorgId 值以及瞬态映射中传递的标记数量一起从 REST 代理发送。
  2. 在验证后,Pedersen 承诺由致盲因子和要转移的令牌数量生成。
  3. 在公共分类账和私人数据收集中,发送方账户中的令牌数量会减少,接收方账户中的数量也会增加。在公共分类账中,代表发件人的现有余额的 Pedersen 承诺由代表代币转移商数量的 Pedersen 承诺减少。对于接收者,余额以相同的方式增加。发送者的余额和接收者的余额的实际值将在私人数据收集中更新。
  4. 此外,还会更新致盲系数,以便随时使用私有数据收集中的余额和致盲系数来验证存储在公共分类账中的相应承诺。

在组织之间转移令牌

要在组织之间转移令牌,发送方会调用 holdTokens API 来提取转移金额并将其置于暂挂状态。
  1. 在机密付款情况下,holdTokens 方法将 token_idoperation_idexpiration_time 值作为输入,并且还需要一个盲法系数,该系数与 notary_user_idnotary_org_idto_user_idto_org_id 值以及瞬态映射中传递的标记数量一起从 REST 代理发送。
  2. 经过验证后,Pedersen 承诺由致盲因子和要保留的令牌数量生成。
  3. 将创建暂挂对象和发送方对象。
  4. 余额承付款、实际余额和事务处理对象将保存到公共分类账和两个组织的私有数据收集中,从而相应地更新所有余额。

持有令牌

如前所述,暂挂操作用于在组织之间转移令牌。暂挂操作使用暂挂、发送者和接收者对象,类似于在公共分类账和专用数据收集中存储数据的事务处理和令牌账户对象。暂挂操作还可用于同一组织中的转移,在这种情况下,不会创建发送者和接收者对象,并且转移使用 Pedersen 承诺作为常规令牌分类框架操作进行。下表显示任何给定暂挂事务处理 ID 的事务处理值存储位置。

在保密模式下,组织之间的传输涉及两个私有数据收集。而不是修改帐户键/值对,对于借项,将在暂挂操作期间创建发送者对象,对于贷项,将在运行 executeHoldReceiver API 时创建接收者对象。余额将置于发送者对象中。贷记金额放置在分配给接收人的接收者对象中。借记操作完成时,发送方对象不再使用,可以将其删除。同样,在余额从接收者对象移至接收者的帐户后,可以删除接收者对象。

公共分类账(状态数据库) 私人数据收集
  • operation_id
  • token_name
  • operation_type
  • status
  • assetType
  • holding_id
  • from_account_id
  • from_org_id
  • to_account_id
  • notary_account_id
  • token_id
  • quantity(已加密)
  • time_to_expiration
  • sender_id
  • category
  • description
  • quantity
  • blinding_factor
  • assetType
  • holding_id

下表显示了为组织间转移和暂挂创建的发送者对象的信息。

公共分类账(状态数据库) 私人数据收集
  • assetType
  • sender_id
  • operation_id
  • account_id
  • transaction_id
  • quantity(已加密)
  • version
  • assetType
  • sender_id
  • blindingFactor

下表显示了为组织间转移和暂挂创建的接收者对象的信息。

公共分类账(状态数据库) 私人数据收集
  • assetType
  • receiver_id
  • operation_id
  • account_id
  • transaction_id
  • quantity(已加密)
  • version
  • assetType
  • receiver_id
  • blindingFactor
  1. 在机密付款情况下,holdTokens 方法将 token_id 和可选参数作为输入,并且还需要一个盲法系数,该系数与接收方的 userIdorgId 值以及瞬态映射中传递的标记数量一起从 REST 代理发送。
  2. 暂挂操作必须由公证用户批准或拒绝。
    • 如果公证用户批准暂挂操作,则从发送者和暂挂对象借记数量,并创建事务处理对象。此外,还会创建接收者对象,并将数量贷记到接收者对象。
    • 如果公证用户拒绝暂挂,则暂挂数量将贷记回发件人账户并创建事务处理对象。
  3. 余额承付款、实际余额和事务处理对象将保存到公共分类账和专用数据收集中,以便相应地更新所有余额。

正在燃烧令牌

要刻录令牌,具有刻录角色的用户将调用 burnTokens API。
  1. 在机密付款情况下,burnTokens 方法将 token_id 值作为输入,并且还需要一个盲法系数,该系数与瞬态映射中传递的标记数量一起从 REST 代理发送。
  2. 经过验证后,Pedersen 承诺由致盲因子和要燃烧的令牌数量产生。
  3. 然后,在公共分类账和专用数据收集中更新总数量。在公共分类账中,代表现有余额的 Pedersen 承诺会随着 Pederson 承诺(代表消耗的令牌数量)的减少而减少。专用数据收集中存储的余额的实际值将相应减少。
  4. 此外,还会更新致盲系数,以便随时使用私有数据收集中的余额和致盲系数来验证存储在公共分类账中的相应承诺。