有没有办法在收到的交易中增加支出?

时间:2018-02-07 12:56:44

标签: corda

我想在单个交易中代表两笔付款,一笔来自甲方(第一方创建交易),另一方来自乙方(应该接收交易的一方)。我已经尝试过将TransactionBuilder对象传递到A和B之间的会话,但该对象不可序列化。我该怎么办?

1 个答案:

答案 0 :(得分:1)

选项1 - 将TransactionBuilder标记为可序列化

默认情况下,作为流的一部分可以在节点之间发送的唯一对象是DefaultWhitelisthttps://github.com/corda/corda/blob/release-V2/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt)中列出的类的实例。

您可以将其他类型列入白名单,以便在节点之间作为流的一部分进行发送,如下所示:

  • 创建自己的序列化白名单,将TransactionBuilder添加到白名单中:

    class TemplateSerializationWhitelist : SerializationWhitelist {
        override val whitelist = listOf(TransactionBuilder::class.java)
    }
    
  • 通过将其完全限定的类名添加到src/main/resources/META-INF/services/net.corda.core.serialization.SerializationWhitelist文件

  • ,在节点上注册其他白名单

N.B。:对于你自己定义的课程,你可以通过将它们注释为@CordaSerializable来实现同样的目的。

选项2 - 将所有交易组件发送给单个协调方

假设您希望Alice成为协调构建事务的一方。您可以编写以下流对:

@InitiatingFlow
@StartableByRPC
class AliceFlow(val bob: Party) : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        val alicesOutputState = MyState()

        val sessionWithBob = initiateFlow(bob)
        val dataFromBob = sessionWithBob.receive<MyState>()
        val bobsOutputState = dataFromBob.unwrap { it -> it }

        val txBuilder = TransactionBuilder(serviceHub.networkMapCache.notaryIdentities.first())
        txBuilder.addOutputState(alicesOutputState, MyContract.ID)
        txBuilder.addOutputState(bobsOutputState, MyContract.ID)

        ...
    }
}

@InitiatedBy(AliceFlow::class)
class BobFlow(val sessionWithAlice: FlowSession) : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        val bobsOutputState = MyState()
        sessionWithAlice.send(bobsOutputState)

        ...
    }
}