【问题标题】:Merkle trees for hiding State fields from counter-parties?用于向对手隐藏状态字段的默克尔树?
【发布时间】:2018-09-05 14:49:21
【问题描述】:

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

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

【问题讨论】:

    标签: corda merkle-tree


    【解决方案1】:

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

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

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

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

    您可以研究额外的加密层,并且只与您想要查看敏感数据的交易对手共享密钥。

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

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

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

    【讨论】:

      【解决方案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)
          }
      }
      

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

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

      【讨论】:

        猜你喜欢
        • 2020-10-10
        • 2011-06-13
        • 2014-02-13
        • 2019-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-28
        相关资源
        最近更新 更多