当帐户和预言机在 corda 中使用时,谓词返回 false



我正在尝试在 corda 中使用帐户功能以及 oracle 功能,问题在于构建一个过滤函数来获取 oracle 签名。 我的 Kotlin 代码使用谓词来检查我的事务中是否有 oracle 密钥,它总是返回 false,即使我在用于签署初始事务的公钥列表中添加了 oracle 公钥。

var requiredSigners = Arrays.asList(oracle.owningKey, urIdentity.owningKey, lenderAccountNewKey)
val output = IOUState(exchangeRate * value, lenderAccountNewKey, borrowerAccountNewKey)
val transactionBuilder = TransactionBuilder(notary)
var participantsList = ArrayList<AbstractParty>(output.participants)
participantsList.add(oracle)
transactionBuilder.addOutputState(output, IOUContract.ID)
.addCommand(IOUContract.Commands.Create(), participantsList.map { it.owningKey })
transactionBuilder.verify(serviceHub)
var localSignedTx = serviceHub.signInitialTransaction(transactionBuilder)
var filteredTx = localSignedTx.buildFilteredTransaction(Predicate {
when (it) {
is Command<*> -> oracle.owningKey in it.signers
else -> false
}
}
val oracleSignature = subFlow(SignFlow(oracle, filteredTransaction))
val stx = locallySignedTransaction.withAdditionalSignature(oracleSignature)

尝试使用以下代码运行时,日志如下所示。

[信息] 2020-05-26T07:00:59,660Z [节点线程-1] corda.flow。 - 流引发错误:集合不包含与谓词匹配的元素。送往流医院进行分诊。 {actor_id=internalShell, actor_owning_identity=O=PartyA, L=London, C=GB, actor_store_id=NODE_CONFIG, fiber-id=10000003, flow-id=040d69f9-f93a-4a23-bdb4-594c41d38987, invocation_id=3da3d8a0-64ec-4a41-8f18-b0ca05557490, invocation_timestamp=2020-05-26T07:00:58.102Z,原产地=内部外壳, session_id=dec88c8e-1441-425b-bfe0-f00ad6b12126, session_timestamp=2020-05-26T06:58:59.126Z, 线程 id=161} [信息] 2020-05-26T07:00:59,666Z [节点线程-1] 状态机。人员流动医院。-流 [040d69f9-f93a-4a23-bdb4-594c41d38987] 住院

  • 指定命令时应传递requiredSigners列表;当前正在传递participantsList
  • 附带说明一下,预言机不应该是参与者;它通常是提供经过验证的数据的第三方。
    如果您要通过使其成为参与者来在预言机中注册完整事务和相关状态(假设participantsList是您将在最终流程中使用的内容(,那么向预言机发送过滤事务的意义何在。
  • 您应该使用WireTransaction来构建过滤的事务(即localSignedTx.tx.buildFilteredTransaction()((注意.tx(。
  • 你有一个错别字,你在SignFlow中使用filteredTransaction;你的变量名是filteredTx

最新更新