Corda-无法处理包含大量状态的事务

Corda-无法处理包含大量状态的事务,corda,Corda,我们遇到了一个问题,即在收集签名和事务完成过程中,net.corda.nodeapi.internal.artemissutils将抛出一个错误: 消息超过maxMessageSize网络参数,当一个事务中的状态数较大时,maxMessageSize:[10485760] 我知道这是ArtemisMQ端的逻辑/健壮检查,因为1消息包含的字节越多,在网络传输过程中失败的机会就越多。 本主题的问题和细节更多地涉及: 是否有人可以提供以下信息,说明在这方面的最佳方式/实践是什么 Corda API可

我们遇到了一个问题,即在收集签名和事务完成过程中,net.corda.nodeapi.internal.artemissutils将抛出一个错误:

消息超过maxMessageSize网络参数,当一个事务中的状态数较大时,maxMessageSize:[10485760]

我知道这是ArtemisMQ端的逻辑/健壮检查,因为1消息包含的字节越多,在网络传输过程中失败的机会就越多。 本主题的问题和细节更多地涉及:

  • 是否有人可以提供以下信息,说明在这方面的最佳方式/实践是什么 Corda API可以处理大量状态和 还有事务流吗
  • 我们能不能把各州都派进来 子流,但仅在父流中完成它们
  • 有没有办法在一个事务中通过 部分(块)或作为流,以防止超出限制,但 还有事务流吗
我将尝试用该问题的代码示例来描述细节:

用例:我们有表示义务的状态(义务状态)和表示付款的状态。一个付款国可以涵盖多个债务并进行结算。因此,付款的结构是:

data class PaymentState(
val paymentItems: List<PaymentItem>,
override val linearId: UniqueIdentifier = UniqueIdentifier()
) : LinearState, QueryableState { ... }

data class PaymentItem(
val id: UUID = UUID.randomUUID(),
val obligationId: UUID,
val amount: Amount
) // not a state just a child

data class ObligationState(
val amount: Amount, // initial obligation amount
val availableAmount, // initially = amount, and will be reduced when be payed/settled 
override val linearId: UniqueIdentifier = UniqueIdentifier()
) : LinearState, QueryableState { ... }
数据类PaymentState(
val付款项目:列表,
重写val linearId:UniqueIdentifier=UniqueIdentifier()
):LinearState,QueryableState{…}
数据类付款项目(
val id:UUID=UUID.randomUUID(),
val obligationId:UUID,
val金额:金额
)//不是一个州,只是一个孩子
数据类倾斜状态(
val金额:金额,//初始债务金额
val availableAmount,//初始=金额,付款/结算时会减少
重写val linearId:UniqueIdentifier=UniqueIdentifier()
):LinearState,QueryableState{…}
user1在一个月内创建1000个义务(不是一个操作) user2支付1000笔债务,并希望在一次交易中完成

一个corda事务可以这样描述:

  • 输入状态和参考-1000义务状态和参考(上一版本)

  • 输出状态-1000个有更新货币的义务状态(必须更新的状态),1个支付状态(必须创建的状态)

因此,所描述的示例在同一事务中包含许多状态,这导致我们有一个巨大的消息要发送给另一方。并且可能出现消息将超过其限制的情况(例如,如果提高付款以覆盖更多的州~1300将超过限制)

因此,我们试图将这笔交易分成多个小部分。但是,如果我们单独执行,将导致其中一个可能失败的情况,因为其他事务已完成,所以无法回滚,因为如果发生smth,最多只能回滚一个事务

我们分为两种方法,首先,我们尝试在一个tx中更新由500分块的ObligationState(子流中的每个tx处理分别进行),当所有tx完成时,它准备在另一个tx中创建PaymentState。这有两个缺点,第一,它不超过1个事务,并且上一个txs的回滚是不可能的,第二个PaymentState可以有任意数量的PaymentItems,如果大约为86.000,它也将超过消息大小的限制

第二种方法是有一个额外的状态来分组汇总付款项目。每组最多有500件物品。因此,如果是1000件物品,它将被分为两组进行一次付款。这解决了上一段中描述的第二个缺陷问题

data class PaymentState(
override val linearId: UniqueIdentifier = UniqueIdentifier(),
val version: Int
// no more contains items
) : LinearState, QueryableState { ... }

data class PaymentItemGroup(
val paymentStateId: UUID, // check always the head state
val paymentItems: List<PaymentItem>,
override val linearId: UniqueIdentifier = UniqueIdentifier()
) : LinearState, QueryableState { ... }
数据类PaymentState(
重写val linearId:UniqueIdentifier=UniqueIdentifier(),
val版本:Int
//不再包含任何项目
):LinearState,QueryableState{…}
数据类PaymentItemGroup(
val paymentStateId:UUID,//始终检查头状态
val付款项目:列表,
重写val linearId:UniqueIdentifier=UniqueIdentifier()
):LinearState,QueryableState{…}
我附上了描述子流顺序处理和并行处理的模式,以加速共享过程。

但是,我们仍然存在一种情况,即其中一笔交易将失败,并且只有部分实际付款反映为已支付/已结算债务。 谢谢
Alex添加Corda邮件列表中的答案:

如果您是网络的所有者,可能可以提高maxMessageSize和maxTransactionSize网络参数:

maxMessageSize:通过网络发送的单个邮件允许的最大字节大小。请注意,附件是一种特殊情况,对于流式传输可能会被分段,但是,单个事务或流消息可能不会大于此值

maxTransactionSize:事务允许的最大字节大小。这是事务对象及其附件的大小


不管怎样,在这场大交易中,所有这些国家和义务都来自同一方吗?如果没有,您可能会泄露一些机密信息,因为为了验证交易,接收合作伙伴必须检查数千个州的解除依赖链。

您好,Ashutosh,谢谢您的回答。这封信是在corda论坛上回复我的,答案是所有国家都有相同的政党。我的问题与网络配置无关,但与corda api有关:如何处理块中的状态,并且在发生错误时仍然能够回滚它们。