我们真的需要一个可以验证的公证人吗?

Joh*_*hnZ 1 corda

冒着听起来幼稚的风险,我问自己“是否需要验证公证人?”,考虑到它的所有问题 - 交易和依赖关系泄漏,状态模型的暴露,仅举几例。我听到的答案与不诚实的节点试图窃取他人资产的潜在攻击有关。例如,在合法交易中,A 方根据 Move 合约向 B 方出售了一些资产 S。紧接着,A 方创建了一个自签名交易,将 S 转回给他自己,该交易受虚假流程中的虚拟合约的约束,该流程甚至不运行账本交易 verify()。但是当他调用 FinaltyFlow 来满足简单公证人在账本上提交交易时,它将使 verifyContracts() 失败,因为 S 指定了 Move 合约,该合约应该说所有者 B 必须签署虚假交易。所以这并不能让我相信需要验证公证人。显然,我一定错过了什么。有人可以启发我吗?

谢谢。

\肖恩

Joe*_*oel 6

正如您所说,验证公证人的优势在于它可以防止恶意方“楔入”一个状态——也就是说,创建一个消耗他们知道的未消费状态的无效交易。尽管交易无效,但非验证公证人不会意识到这一点,并将状态标记为已花费。

您是正确的,此无效交易将使FinalityFlow的调用失败verifyContracts()。但是,我们不能强制使用恶意节点向FinalityFlow公证人发送某些内容。例如,如果恶意节点有足够的动机,他们可以手动构建无效交易哈希并将其直接发送给公证人。

但是,请注意,在非验证公证人的情况下,仍然有多层保护以防止楔入:

  • 恶意方必须知道他们想要楔入的状态。由于 Corda 中的信息仅在需要知道的基础上分发,因此节点只会知道未使用状态的一小部分子集
  • 如果状态被意外楔入,节点可以向公证人显示无效交易。公证人看到交易无效,将重新标记状态标记为未消费
  • 由于 Corda 是一个许可网络,公证人可以记录提交交易的每个人的合法身份。如果恶意节点提交无效交易以消耗状态,则他们的身份将被知晓,并且可以根据管理参与网络的协议在平台外解决争议

另一方面,SGX 解决了与验证公证人相关的数据泄漏问题。如果交易的验证发生在 SGX 飞地内,则验证公证人不会获得有关他们正在验证的交易内容的信息。

最终,验证和非验证公证人之间的选择归结为与给定部署相关的威胁模型。如果您在确定参与者不会故意更改其节点代码或恶意行为的环境中使用 Corda,则不需要验证公证人。

但是,如果您假设有人会尝试作弊并愿意编写自己的代码来这样做,那么验证公证人会提供额外的保护层。

所以 Corda 提供了选择:

  • 如果您对参与者的信任度相对较低,则选择向公证人集群透露更多信息……
  • 如果您认为向公证人透露过多信息的风险是更大的问题,请选择向公证人集群少透露

(如果您对每个人都感到偏执,请使用 SGX!)