Corda 如何存储与状态相关的额外私人信息?

Corda 如何存储与状态相关的额外私人信息?,corda,Corda,我有一个简单的流程,它在买方和卖方之间创建了一个状态,显然,双方都可以看到状态中的一切 但是,我现在有一个要求,即买方希望存储处理交易的用户,以便进行审计和报告 在这种情况下,用户不是节点或帐户,而是已登录到应用程序并通过Active Directory授权的用户 我可以将用户名作为字符串添加到状态中,但这将向卖家公开私有数据 另一种方法是以某种方式混淆名称,但我更愿意将信息存储在州外的单独表格中,并且仅将其存储在买家保险库中 我如何做到这一点?是否有一个示例对此进行了演示?您可以创建第二个输出

我有一个简单的流程,它在买方和卖方之间创建了一个状态,显然,双方都可以看到状态中的一切

但是,我现在有一个要求,即买方希望存储处理交易的用户,以便进行审计和报告

在这种情况下,用户不是节点或帐户,而是已登录到应用程序并通过Active Directory授权的用户

我可以将用户名作为字符串添加到状态中,但这将向卖家公开私有数据

另一种方法是以某种方式混淆名称,但我更愿意将信息存储在州外的单独表格中,并且仅将其存储在买家保险库中


我如何做到这一点?是否有一个示例对此进行了演示?

您可以创建第二个输出状态,该状态在同一事务中使用,但只有令牌颁发者作为参与者。当然,这取决于您如何在“已发布状态”和“记录器状态”之间建立链接,这取决于您将在后者中存储什么

让我们举一个从Node1到Node2的可替换令牌发行的示例。您可以创建一个“发布记录器状态”,目的是仅在Node1的vault上记录某些内容,如下所示(注意参与者列表):


我认为,通过这种方式,记录器状态将以原子方式存储在Node1的vault中。如果发生某种情况,两种输出状态下的交易都不会成功。

我想不出一种不同的方法,就是用买方节点的公钥加密用户名并将其存储在该表单中;这样,只有私钥的持有者才能在需要时解密它;特别是收据模式部分,也许它会给你一个解决方案。你也可以阅读隐私模式。这可能是未来的方向。您能否详细说明您将如何创建第二个状态,该状态不在事务中使用,但也是原子状态,并直接链接到事务中使用的状态?
// the "recorder" state visible only in Node1's vault
@BelongsToContract(IssuanceRecordContract::class)
class IssuanceRecord(
        val holder: AbstractParty,
        val amount: Amount<IssuedTokenType>
 ) : ContractState {
      override val participants: List<AbstractParty>
          get() = listOf(amount.token.issuer)
}
// This is from the Issuanflow launched from Node1
@Suspendable
override fun call(): String {
...
...
// Create the FungibleToken (issuedToken is an IssuedTokenType created before)
val tokenCoin = FungibleToken(Amount(volume.toLong(), issuedToken), holderAnonymousParty)

// create the "recorder" output state visible only to Node1
val issuanceRecord = IssuanceRecord(holderAnonymousParty, tokenCoin.amount)

// create the Transaction Builder passing the "recorder" output state
val transactionBuilder = TransactionBuilder(notary).apply {
    addOutputState(issuanceRecord, IssuanceRecordContract.ID)
    addCommand(Command(IssuanceRecordContract.Commands.Issue(), ourIdentity.owningKey))
}

// Issue the token passing the transactionBuilder and the fungible token
addIssueTokens(transactionBuilder, tokenCoin)

// collect signatures
// verify transaction
// FinalityFlow (fundamental to make this work in Node1)
}