Corda v3文档描述Transaction tear-offs以及使用Merkle树在交易过程中“隐藏”信息。具体来说,使用的示例是在验证事务期间隐藏来自Oracle的敏感数据。
Corda框架是否支持使用Merkle树来隐藏签署对方节点的信息?或者当完全签名的事务连接到对方节点时,是否可以隐藏状态信息的子集? “编辑”的级别是否可以通过对方节点而有所不同,或者当完全签署的交易分配给其他方时,国家是否必须相同?
答案 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)
}
}
您仍然无法验证交易的智能合约,但至少可以确保您不会通过签名使用任何自己的输入。
您可以通过不同的方式使用此方法。例如,您可以检查是否只有附件被撕下,附件中可能包含不允许对方看到的秘密数据。