关于上一个问题,我问Corda - Purpose of NULL_PARTY,凯斯(Cais)指出,NULL_PARTY
可能不应该在生产代码中使用,但是在R3与更多开发人员交谈之后,我想介绍一下一个可能有用的用例。
我有一个特殊的用例,其中一方可能是Corda网络上的签约方,也可能不是Corda网络上的非签约方,但其他参与者仍然需要意识到该方“处于关闭状态”链”。
考虑到这一点,我实施了一个脱链派对:
import net.corda.core.crypto.NullKeys.NULL_PARTY
import net.corda.core.identity.AbstractParty
import net.corda.core.utilities.OpaqueBytes
class OffChainParty(val reference: String) : AbstractParty(party.owningKey) {
companion object {
private val party = NULL_PARTY
}
override fun nameOrNull() = party.nameOrNull()
override fun ref(bytes: OpaqueBytes) = party.ref(bytes)
}
可能需要脱链参与的国家将这样实施:
data class ObligationState(
val obligor: AbstractParty,
val obligee: AbstractParty,
val insurer: AbstractParty
) : ContractState {
val participants: List<AbstractParty>
get() = listOf(obligor, obligee, insurer).filter { it !is OffChainParty }
}
然后我们可以像这样包括签署参与者:
val state = ObligationState(alice, bob, charlie) // assume they're all known parties.
我们可以像这样包括未签名的参与者:
val state = ObligationState(alice, bob, OffChainParty("acme technology"))
问与答
问:为什么不只使用AbstractParty?
并将其设置为null
?
A:因为其他参与者无法确定谁是null
,但他们可以确定谁是“ acme技术”,而无需他们签名。
问:为什么不使用String
引用而不是绕开AbstractParty
?
A:因为有时我们希望聚会签字,所以他们必须是真实的 Party
,有时,我们只是想知道他们是谁,而不论是否他们是否在“链上”。
对这种方法有何想法?
答案 0 :(得分:2)
这是一个非常好的主意,您实际上会将OffChainParty嵌入到状态中(并因此嵌入到分类帐中),而又不使其成为节点连接到的网络的必需成员。
我唯一要说的是,您是否完全需要NULL_PARTY,并且您将必须小心以确保始终过滤参与者。
关于将Destination
引入Corda的工作非常有趣,可能类似于NetworkDestination
或OffNetworkDestination
,因此请密切注意开源仓库。