如何存储与州相关的额外私人信息?

时间:2020-09-08 20:52:34

标签: corda

我有一个简单的流程,可以在买卖双方之间创建一个状态,很明显,每一方都可以看到该状态上的所有内容。

但是,我现在有一个要求,即买方要存储为审计和报告目的而处理了交易的用户。

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

我可以将用户名作为String添加到状态中,但这会将私有数据公开给卖方。

另一种方法是以某种方式混淆名称,但我宁愿将信息存储在州外的单独表中,并且存储在买方库中。

我该怎么做?有一个示例可以证明这一点吗?

1 个答案:

答案 0 :(得分:1)

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

让我们举一个从Node1到Node2的可替代令牌发行的示例。您可以创建一个“发行记录器状态”,该状态仅旨在在Node1的保管库中记录某物,如下所示(请注意参与者列表):

// 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)
}

,然后您可以将其传递给您用来发布可替代令牌的同一个TransactionBuilder(而是参与者的参与者都在参与者列表中),就像这样:

// 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)
}

我认为,记录器状态将自动存储在Node1的保管库中。如果发生某种情况,则在两个输出状态下事务都不会成功。