Corda 是否有办法将支出添加到收到的交易中?

Corda 是否有办法将支出添加到收到的交易中?,corda,Corda,我想在一笔交易中代表两笔付款,一笔来自甲方(第一个创建交易的人),一笔来自乙方(应该接收交易的人)。我已经尝试通过a和B之间的会话传递TransactionBuilder对象,但该对象不可序列化。如何操作?选项1-将TransactionBuilder标记为可序列化 默认情况下,作为流的一部分,节点之间可以发送的唯一对象是DefaultWhitelist()中列出的类的实例 您可以将用于在节点之间发送的其他类型列为白名单,作为流的一部分,如下所示: 创建自己的序列化白名单,将Transacti

我想在一笔交易中代表两笔付款,一笔来自甲方(第一个创建交易的人),一笔来自乙方(应该接收交易的人)。我已经尝试通过a和B之间的会话传递TransactionBuilder对象,但该对象不可序列化。如何操作?

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

默认情况下,作为流的一部分,节点之间可以发送的唯一对象是
DefaultWhitelist
()中列出的类的实例

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

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

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

注意:对于您自己定义的类,您可以通过将它们注释为
@cordaseriable
来实现相同的功能

选项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)

        ...
    }
}
@InitiatingFlow
@星表
类AliceFlow(val-bob:Party):FlowLogic(){
@暂停
覆盖有趣的调用(){
val AliceOutputState=MyState()
val sessionWithBob=initiateFlow(bob)
val dataFromBob=sessionWithBob.receive()
val bobsOutputState=dataFromBob.unwrap{it->it}
val txBuilder=TransactionBuilder(serviceHub.networkMapCache.NotaryIdentity.first())
txBuilder.addOutputState(AliceOutputState,MyContract.ID)
txBuilder.addOutputState(bobsOutputState,MyContract.ID)
...
}
}
以及:

@InitiatedBy(AliceFlow::class)
类BobFlow(val sessionWithAlice:FlowSession):FlowLogic(){
@暂停
覆盖有趣的调用(){
val bobsOutputState=MyState()
sessionWithAlice.send(bobsOutputState)
...
}
}

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

默认情况下,作为流的一部分,节点之间可以发送的唯一对象是
DefaultWhitelist
()中列出的类的实例

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

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

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

注意:对于您自己定义的类,您可以通过将它们注释为
@cordaseriable
来实现相同的功能

选项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)

        ...
    }
}
@InitiatingFlow
@星表
类AliceFlow(val-bob:Party):FlowLogic(){
@暂停
覆盖有趣的调用(){
val AliceOutputState=MyState()
val sessionWithBob=initiateFlow(bob)
val dataFromBob=sessionWithBob.receive()
val bobsOutputState=dataFromBob.unwrap{it->it}
val txBuilder=TransactionBuilder(serviceHub.networkMapCache.NotaryIdentity.first())
txBuilder.addOutputState(AliceOutputState,MyContract.ID)
txBuilder.addOutputState(bobsOutputState,MyContract.ID)
...
}
}
以及:

@InitiatedBy(AliceFlow::class)
类BobFlow(val sessionWithAlice:FlowSession):FlowLogic(){
@暂停
覆盖有趣的调用(){
val bobsOutputState=MyState()
sessionWithAlice.send(bobsOutputState)
...
}
}

选项2不能保证Alice没有恶意更改bob的状态,对吗?正确。Bob必须在签名之前重新检查事务。选项2不能保证Alice没有恶意更改Bob的状态,对吗?正确。鲍勃在签字之前必须重新检查交易。