我有一个简单的流程,可以在买卖双方之间创建一个状态,很明显,每一方都可以看到该状态上的所有内容。
但是,我现在有一个要求,即买方要存储为审计和报告目的而处理了交易的用户。
在这种情况下,用户不是节点或帐户,而是已登录到应用程序并通过Active Directory授权的用户。
我可以将用户名作为String添加到状态中,但这会将私有数据公开给卖方。
另一种方法是以某种方式混淆名称,但我宁愿将信息存储在州外的单独表中,并且仅存储在买方库中。
我该怎么做?有一个示例可以证明这一点吗?
答案 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的保管库中。如果发生某种情况,则在两个输出状态下事务都不会成功。