2

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

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

4

2 回答 2

3

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

  • 它不包含双花
  • 合同有效
  • 由所需各方签署

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

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

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

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

最后一点,一旦交易签署,就不能在不使交易无效的情况下进行更改。

最后,看看 Mike Hearn 的这篇博文 - https://www.corda.net/2017/06/corda-sgx-privacy-update/ 这解决了描述的隐私问题,没有使用过滤

于 2018-03-27T15:30:40.030 回答
3

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

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

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

于 2018-08-10T14:43:05.217 回答