冒着听起来天真的风险,我问自己"是否需要验证公证人?",考虑到它的所有问题 - 事务和依赖关系泄漏,状态模型的暴露,仅举几例。 我听到的答案与潜在的攻击有关,其中一个不诚实的节点试图窃取其他人的资产。例如,在合法交易中,partyA向partyB出售了某些资产S,并受到Move合约的约束。紧接着,partyA创建了一个自签名事务,该事务将S转回给自己,但是假冒合同中的虚假合同甚至不运行分类帐事务验证()。但当他调用FinaltyFlow来满足简单的公证人在分类账上提交交易时,它将失败verifyContracts(),因为S指定Move合约,该合约应该说所有者partyB必须签署虚假交易。 所以这并不能说服我需要一个验证公证人。 显然,我一定错过了什么。有人可以开导我吗?
感谢。
\肖恩
答案 0 :(得分:4)
正如您所说,验证公证人的优势在于它可以防止恶意方“楔入”某个状态 - 也就是说,创建一个消耗他们所知道的未消耗状态的无效事务。虽然交易无效,但非验证公证人不会意识到这一点,并将该状态标记为已花费。
这是无效的,这个无效的交易会导致FinalityFlow
对verifyContracts()
的调用失败。但是,我们无法强制恶意节点使用FinalityFlow
向公证人发送内容。如果恶意节点有足够的动机,他们可以手工构建无效的事务哈希,并将其直接发送给公证人。例如。
但是,请注意,在非验证公证的情况下,仍有多层防止楔入的保护:
另一方面,SGX解决了与验证公证人相关的数据泄漏问题。如果交易验证发生在新交所飞地内,则验证公证人不会获得有关他们正在验证的交易内容的信息。
最终,验证和非验证公证人之间的选择归结为与给定部署相关联的威胁模型。如果您在确定参与者不会故意更改节点代码或恶意行为的情况下使用Corda,则不需要验证公证人。
但是如果你假设有人会试图作弊并且愿意编写自己的代码来做到这一点,那么验证公证人会提供额外的保护层。
所以Corda提供了选择:
(如果你对每个人都是偏执狂,请使用SGX!)