有一种误解,认为Corda无法通过网络广播数据。 这是完全错误的。 实际上,Corda可以在网络中的节点之间发送任何内容。 Corda不会做的是与与单个交互无关的节点共享不必要的数据(交易)。 默认情况下,隐私是Corda设计的核心组成部分。 与其他DLT(分布式分类帐技术)平台和区块链相比,这确实是一个很大的差异。 与非交易方共享数据可能不属于Corda的默认行为,但这绝对是其能力范围之内。 在本文中,我将演示将事务发送到任何所需节点所需的少量代码。
话虽如此,本文中包含的代码仅是一个简单的实现。 展望未来,我打算就此主题撰写更多文章,并朝广播交易的更复杂,更有用的实现方向发展。
在向您展示任何代码之前,我们应该先简短地谈谈将数据广播给最初不参与交易的各方的必要性。 我遇到的最常见原因是需要满足法规要求。 对于某些工作流程,信息必须与第三方共享。 然后,这些各方可以验证没有任何躲闪事件发生,也可能是到现实世界的链接。 我不会撒谎。 这并不是我的专业领域。 幸运的是,如果您由于担心满足监管要求而正在阅读本文,那么您可能比我更了解为什么需要广播交易的能力。
在文档中也有关于此主题的信息。
进入代码。 以下是将SignedTransaction
发送给传递给它的任何Party
的流程:
@InitiatingFlow class BroadcastTransactionFlow(
private val stx: SignedTransaction,
private val recipients: List<Party> ) : FlowLogic<Unit>() {
@Suspendable
override fun call() {
for (recipient in recipients) {
val session = initiateFlow(recipient)
subFlow(SendTransactionFlow(session, stx))
}
} }
对于这种情况,Corda几乎从平台内部完成了所有繁重的工作。 因此,您唯一需要做的就是遍历传入的各方并将事务发送给每一方。
每个对SendTransactionFlow
调用将与以下找到的响应者流进行通信:
@InitiatedBy (BroadcastTransactionFlow:: class ) class BroadcastTransactionResponder( private val session: FlowSession) : FlowLogic<Unit>() {
@Suspendable
override fun call() {
subFlow(ReceiveTransactionFlow(session, statesToRecord = StatesToRecord.ALL_VISIBLE))
} }
call
内只有一行。 因此,由于没有别的东西存在,因此它很重要。 ReceiveTransactionFlow
是ReceiveTransactionFlow
的对等方, SendTransactionFlow
接收并保留发送给它的事务。 此外, statesToRecord
属性确定应将事务中的哪些状态存储在保管库中。 由于这是广播(可能出于监管原因),所以交易的内容将变得很重要。 为了实现这一目标, StatesToRecord.ALL_VISIBLE
用来告诉ReceiveTransactionFlow
记录包含在交易中的每一个状态。 如果根据您的用例,您不需要事务的所有状态,则可以使用ONLY_RELEVANT
甚至NONE
。
这些摘录中的最后一条重要代码行是BroadcastTransactionFlow
上的@InitiatingFlow
批注。 批注允许流在不要求其调用者创建会话的情况下进行工作,也无需将其传递到流中。 流程将处理该问题。 从逻辑上讲,这是有道理的,因为在大多数情况下,您不会与尚未存储事务的各方发起会话。 因此,从另一个内部使用此流程非常简单。 例如,可以将其添加到流的末尾:
subFlow(FinalityFlow(stx, sessions)).also {
// sends to everyone in the network
val broadcastToParties = serviceHub.networkMapCache.allNodes.map { node -> node.legalIdentities.first() }
.minus(serviceHub.networkMapCache.notaryIdentities)
.minus(message.recipient)
.minus(message.sender)
subFlow(BroadcastTransactionFlow(it, broadcastToParties)) }
此时,在调用BroadcastTransactionFlow
,事务将存在于传递给该流的各方的保险库中。 这包括交易中包含的状态。 太好了,工作完成了。 您现在知道Corda可以广播交易。
在复制和粘贴此代码并将其直接交付生产之前,我需要解决一个问题。 从广播的事务中接收输出状态的各方也可以使用它们。 因此,如果您希望像这样共享交易,则需要采取必要的保护措施,以防止组织花费并非真正属于它们的状态。 是的,该组织可能是监管者,而他们做任何狡猾的事情的机会都很低。 是的,有可能在Corda之外解决这些问题。 但是,这些假设都不是理想的。 为了避免这种情况,您的合同和流程必须设计为防止组织花费非其国家的费用。 CorDapp开发人员将承担此责任 。 不是科尔达。 必须控制Corda的灵活性,以防止出现不希望的结果。 我将在以后的文章中讨论这个主题。
总而言之,Corda无法将交易广播到最初未参与该过程的各方是一个神话。 您可以使用本文中介绍的代码在您的应用程序中实现此目的。 这不是最快的实现。 但这有效。 允许与需要网络上发生的交易详细信息的组织共享数据,而这些组织本身不包含在其他交易中。
如果您喜欢这篇文章或发现它对您有帮助(或两者都有),请随时在Twitter上@LankyDanDev关注我,并记住与可能对您有用的任何人分享!
翻译自: https://www.javacodegeeks.com/2019/08/broadcasting-transaction-external-organisations.html