Corda-我们可以再次在生产代码中使用NULL_PARTY吗?

时间:2019-06-18 15:26:41

标签: corda

关于上一个问题,我问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,有时,我们只是想知道他们是谁,而不论是否他们是否在“链上”。

对这种方法有何想法?

1 个答案:

答案 0 :(得分:2)

这是一个非常好的主意,您实际上会将OffChainParty嵌入到状态中(并因此嵌入到分类帐中),而又不使其成为节点连接到的网络的必需成员。

我唯一要说的是,您是否完全需要NULL_PARTY,并且您将必须小心以确保始终过滤参与者。

关于将Destination引入Corda的工作非常有趣,可能类似于NetworkDestinationOffNetworkDestination,因此请密切注意开源仓库。