概要
- Notaries 避免“双花 double spends”
- Notaries 也可以用来验证交易,这个是可选的一个服务
- 一个网络中可以有多个 notaries,每一个 notary 运行一个不同的共识算法(consensus algorithm)
总览
一个公证人 Notary 是一个网络服务,通过证明一个给定的交易的 input 是没有被其他的交易消费过的方式提供了唯一性共识。
对于给定的一个交易, notary 会进行下边两种操作中的一种:
- 如果对于给定的交易中的 input,没有任何其他的交易已经消费该 input 的时候,会提供签名
- 如果发现 input 已经被重复消费的话,就会拒绝提供签名
通过这样做,notary 就在系统中提供了一个最后的步骤。在最终获得 notary 的签名之前,交易各方并不能确定交易的有效性。但是当收到了 notary 的签名之后,我们可以确认的是,交易中的 Input 是没有被其他任何的交易所消费过的。因此公证(notarisation)在系统里是最后的一步。
每个 state 都会有一个指定的 notary,而且 notary 也只会去公正那些 input 指定它为公证人的 transaction。
共识算法 Consensus algorithms
Corda 拥有一套“可插拔 pluggable” 的共识机制,允许 notaries 根据不同的需求来选择一种共识算法。
也就是说 notary 可能因为下边的原因不同:
- 结构(structure)- 一个 notary 可能是一个单独的网络节点,或者是互相信任的节点集群,或者是互不信任的节点集群
- 共识算法(consensus algorithm)- 一个 notary service 可能会选择运行一个高速,高信任的算法(比如 RAFT),或者一个低速低信任的算法(比如 BFT),又或者是任何其他的选择的共识算法
验证 Validation
一个 notary service 还需要选择是否在提交之前通过验证每个 transaction 的有效性来提供这种有效性共识(validity consensus)服务。为了做出这个选择,他们需要面对下边的问题:
- 如果一个 transaction 没有被检查正确性,那么这就增加了“denial of state”袭击的风险,指的就是某个节点知道这是一个不正确的 transaction 会消费到一些 states,然后该节点还是把这个 transaction 发送给 notary,但是 notary 如果不进行正确性验证的话,会把这个 state 变为历史记录被消费掉,这显然是不正确的
- 如果 transaction 已经被验证了正确与否,notary 需要查看该 transaction 的全部内容以及它的所有依赖。这就向 notary 暴露了一些潜在的隐私数据。
对于非验证模式,Corda 的可控数据分布模型(controlled data distribution modal) 意味着未被消费的 states 不会被大面积的共享。另外, Corda 的 permissioned network 也意味着 notary 能够存储造成 “denial of state” transaction 的一方,这就允许能够在账本外去解决掉这个袭击。
对于 validating model,对于匿名的使用,使用新生成的公钥而不是使用法律的名字(legal identities)来标记各方也限制了 notary 能够看到的信息
多个 Notaries Multiple notaries
每个 Corda network 允许存在多个 notaries,每个 notary 可能会运行一套不同的共识算法。这会带来以下的好处:
- 隐私性(privacy) - 我们可以在同一个网络中同时拥有 validating 和 non-validating notary services。这就允许节点针对每个 transaction 来选择更喜欢的不同的 notary。
- 负载平衡(load balancing)- 将 transaction 的工作分发给多个 notaries 可以加快 transaction 的处理速度
- 低延迟(low latency)- 通过选择物理上离自己最近的 notary 来获得最小化的延迟
更换 Notaries Changing notaries
一个 notary 只有当它是这个 transaction 里的所有 input states 指定的 notary 的情况下才可以提供签名。然而下边的情况可能需要换一个 state 的指定的 notary:
- 当一个 transaction 需要消费的 states 中指定了不同的 notaries
- 当一个节点因为隐私和效率的考虑希望选择一个不同的 notary
当这样的 transactions 被创建之前,states 必须首先被指定到同一个 notary。这可以通过一个 notary-change transaction 来实现:
- 单一的一个 input state
- 一个 output state 指定到这个 input state,除非指定的 notary 被改变了
如果该 transaction 不会造成“双花”,这个 input state 指定的 notary 会为该 transaction 提供签名。