Corda Merkle树用于向对手隐藏州域?

Corda Merkle树用于向对手隐藏州域?,corda,merkle-tree,Corda,Merkle Tree,Corda v3文档描述了如何在事务期间使用Merkle树来“隐藏”信息。具体来说,使用的示例是在Oracle验证事务期间对其隐藏敏感数据 Corda框架是否支持使用Merkle树对签名的对方节点隐藏信息?或者,当完全签名的事务连接到对方节点时,是否可以隐藏状态信息的子集?“编校”的级别是否会因交易对手节点的不同而不同,或者当完全签署的交易分发给其他方时,状态是否必须相同?在Corda中,交易是更新分类账的建议。 只有在以下情况下,才会提交交易建议书: 它不包含双倍支出 它在合同上是有效的 由

Corda v3文档描述了如何在事务期间使用Merkle树来“隐藏”信息。具体来说,使用的示例是在Oracle验证事务期间对其隐藏敏感数据


Corda框架是否支持使用Merkle树对签名的对方节点隐藏信息?或者,当完全签名的事务连接到对方节点时,是否可以隐藏状态信息的子集?“编校”的级别是否会因交易对手节点的不同而不同,或者当完全签署的交易分发给其他方时,状态是否必须相同?

在Corda中,交易是更新分类账的建议。 只有在以下情况下,才会提交交易建议书:

  • 它不包含双倍支出
  • 它在合同上是有效的
  • 由所需各方签署
简单的答案是,这取决于您的合同代码。当然,您可以使用该框架构建过滤的交易,并将其发送给交易对手进行签名。然而,他们只有在合同有效的情况下才会签字

不过,我认为在这条路上你会发现一些问题,因为你基本上是在要求交易对手在不知道他们在签署什么的情况下签署一些东西,例如,交易可能包括一组隐藏的状态转移他们的现金

您可以查看其他加密层,只与您希望查看敏感数据的交易对手共享密钥

Corda还支持使用流框架发送数据,因此您可以在事务之外单独发送敏感数据

在最后一点上,一旦交易被签署,在不使交易无效的情况下,它就不能被更改

最后,看看迈克·赫恩的这篇博文-
这解决了在不使用过滤的情况下所描述的隐私问题

,正如Cais所说,使用撕毁对交易对手隐藏部分交易的局限性在于,交易对手可能不愿意签署交易,因为他们无法准确地知道他们签署的是什么。如果其中一个被撕掉的投入物是属于他们的现金并被转移给其他人怎么办

但是,对于任何已删除的事务,您至少能够检查某个组的所有组件(输入、输出、命令、附件……)是否已删除。例如,您可以使用它来检查在签名之前是否没有从事务中删除任何输入:

@InitiatingFlow
@StartableByRPC
class Initiator(val counterparty: Party) : FlowLogic<Unit>() {

    @Suspendable
    override fun call() {
        val notary = serviceHub.networkMapCache.notaryIdentities[0]
        val txBuilder = TransactionBuilder(notary)
                .addOutputState(TemplateState(), TemplateContract.ID)
                .addCommand(TemplateContract.Commands.Action(), ourIdentity.owningKey)

        val partlySignedTx = serviceHub.signInitialTransaction(txBuilder)

        // We filter out the outputs, which are of type `TransactionState<ContractState>`.
        val filteredTx = partlySignedTx.buildFilteredTransaction(Predicate {
            when (it) {
                is TransactionState<ContractState> -> false
                else -> true
            }
        })

        val session = initiateFlow(counterparty)
        val signature = session.sendAndReceive<TransactionSignature>(filteredTx).unwrap { it }
        val fullySignedTx = partlySignedTx.withAdditionalSignature(signature)

        subFlow(FinalityFlow(fullySignedTx))
    }
}

@InitiatedBy(Initiator::class)
class Responder(val session: FlowSession) : FlowLogic<Unit>() {

    @Suspendable
    override fun call() {
        val filteredTx = session.receive<FilteredTransaction>().unwrap { it }

        // We check that all inputs are visible before accidentally signing something away.
        filteredTx.checkAllComponentsVisible(ComponentGroupEnum.INPUTS_GROUP)

        val signature = serviceHub.createSignature(filteredTx)

        session.send(signature)
    }
}
@InitiatingFlow
@星表
类发起人(val对方:参与方):FlowLogic(){
@暂停
覆盖有趣的调用(){
val notary=serviceHub.networkMapCache.NotaryIdentity[0]
val txBuilder=TransactionBuilder(公证人)
.addOutputState(TemplateState(),TemplateContract.ID)
.addCommand(TemplateContract.Commands.Action(),ourIdentity.owningKey)
val partlySignedTx=serviceHub.signInitialTransaction(txBuilder)
//我们过滤掉“TransactionState”类型的输出。
val filteredTx=partlySignedTx.buildFilteredTransaction(谓词{
什么时候{
是TransactionState->false吗
否则->正确
}
})
val会话=发起流量(交易对手)
val signature=session.sendandereceive(filteredTx).unwrap{it}
val fullySignedTx=partlySignedTx.带有附加签名(签名)
子流(最终流(fullySignedTx))
}
}
@发起人(发起人::类)
类响应程序(val会话:FlowSession):FlowLogic(){
@暂停
覆盖有趣的调用(){
val filteredTx=session.receive().unwrap{it}
//我们检查所有输入是否可见,然后才意外地签名。
filteredTx.checkAllComponentsVisible(ComponentGroupEnum.INPUTS\u组)
val signature=serviceHub.createSignature(filteredTx)
会话发送(签名)
}
}
您仍然无法验证交易的智能合约,但至少可以确保您没有通过签名使用任何自己的输入

您可以以不同的方式使用此方法。例如,您可以检查是否仅删除了附件,其中附件可能包含不允许对方查看的机密数据