默克尔树从反对党隐藏国家领域?

时间:2018-03-27 09:09:21

标签: corda merkle-tree

Corda v3文档描述Transaction tear-offs以及使用Merkle树在交易过程中“隐藏”信息。具体来说,使用的示例是在验证事务期间隐藏来自Oracle的敏感数据。

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

2 个答案:

答案 0 :(得分:2)

在Corda中,交易是更新分类帐的提案。 只有在以下情况下才会提交交易提案:

  • 它不包含双倍花费
  • 合约有效
  • 由所需方签名

简单的答案是,这取决于您的合同代码。您当然可以使用该框架来构建已过滤的事务,并将其发送给交易对手进行签名。但是,只有在合同有效的情况下,他们才会签名。

我认为你会发现沿着这条路走下去的问题,因为你基本上要求交易对手签署一些东西,而不知道他们正在签署什么,例如该交易可能包括一组隐藏的国家转移他们的现金。

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

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

关于你的最后一点,一旦签署了交易,就不能在没有使交易失效的情况下改变交易。

最后,看看Mike Hearn撰写的这篇博客文章 - https://www.corda.net/2017/06/corda-sgx-privacy-update/ 这解决了在不使用过滤的情况下描述的隐私问题

答案 1 :(得分:2)

正如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)
    }
}

您仍然无法验证交易的智能合约,但至少可以确保您不会通过签名使用任何自己的输入。

您可以通过不同的方式使用此方法。例如,您可以检查是否只有附件被撕下,附件中可能包含不允许对方看到的秘密数据。