Corda 核心概念:Oracles

原文地址:https://docs.corda.net/key-concepts-oracles.html

概要

概览

很多时候 transaction 的合约有效性(contractual validity)需要依赖一些外部的数据,比如当前的汇率是多少。如果让每个参与方给予他们对于汇率的观点来验证 transaction 的有效性的话,合约的执行就会变得没有确定性(non-deterministic)了:一些参与者可能会认为 transaction 是有效的,而其他的参与者可能认为无效。

Corda 通过使用 Oracle 来解决这个问题。Oracle 是一个网络服务,可以根据要求提供包含某一事实的命令(比如在某个时间的汇率)并且将 Oracle 列为要求签名的一方。

如果一个节点希望在一个 transaction 中使用某一个事实,那么它可以提出从 Oracle 来获取该事实的一个命令。如果 Orale 认为这个事实是正确的,它会返回这个要求的命令。然后这个节点就可以把这个命令添加到 transaction 中了,然后 oracle 会为这个事实是真的提供签名。

Transaction tear-offs

为了给一个 transaction 提供签名,Oracle 需要看的唯一的信息就是 transaction 里边的 command。向 Oracle 提供任何其他的信息会造成信息泄露。相类似的,一个 non-validating notary 只需要看到 transaction 的 input states 而不需要关注 contract code 是怎么写的,如果把 contract code 也发给了 non-validating notary 的话也会造成信息泄露。

为了避免这种问题,在 transaction 被展示给 oracle/notary 之前,transaction 的提出者会使用 Merkle tree 来将 oracle/notary 不需要看到的东西给“撕掉(tear off)”(也就是变为不可见)。Merkle tree 是非常有名的加密结构,常被用于提供 proof of inclusion 和 data integrity。Merkle tree 被广泛应用于 peer-to-peer networks, blockchain systems 和 git。

Merkle tree 的优点在于那些在 transaction 被展示给 oracle 之前被“撕掉”的部分不会在后来被改变,也不会使 Orcle 提供的签名变为无效。

交易默克尔树 Transaction Merkel trees

Transaction 中的 Merkle tree 是通过将 transaction 分解为不同的叶子的结构来实现的,每一片叶子或者是一个 input,一个 output,一个 command 或者是一个 attachment。Merkle tree 也包含了一些其他的 WireTransaction 的 fields,比如 timestamp,notary,type 和签名者。

接下来,Merkle tree 会按照常规方式将节点的 hash codes 组合到一次再次 hash,变为一个新的叶子,再将新叶子和它旁边的叶子再进行这样的处理,一直到最终只剩下一个叶子(就是根了)。下边的图展示了这个过程,H 表示 sha256 方法,“+”表示联合

Merdle Tree

Transaction 有两个 input states,一个 output state,一个 attachment,一个 command 和 timestamp。为了简单,我们并没有列出所有其他的 fields (type, notary and signers并合并为一个叶子名字 Rest,但是实际的工作中他们应该是不同的叶子)。注意到当一个树不是一个 full binary tree 的话(个人理解就是叶节点的个数不是偶数,是奇数),会和旁边的一个 0 hash 的叶子整合,上边的是浅绿色的叶节点。最终 root 的 hash 就会成为该 transaction 的 identifier,这也会被用来签名和验证数据的 integrity。对 Transaction 的任何一个叶子的修改都会改变 transaction 的 identifier。

隐藏数据 Hiding data

隐藏交易中部分的数据并且提供其他所需的数据是通过构建一个 Partial Merdle Trees(或者 默克尔分支)来实现的。一个默克尔分支是一组哈希值,提供了叶节点的数据,用来计算根节点的哈希值。然后这个哈希值会用来同整个的交易的哈希值进行比较,如果两个哈希值匹配,那就意味着我们获得的数据属于这个指定的交易。

Partial Merkle Tree

上边的例子中,节点 H(f) 包含了 Oracle service 签名所需的 command 数据。蓝色的叶子 H(g) 也被包含了进来因为它含有时间戳信息。Partial Merkle Tree 中标记为 Provided 的节点里,黑色的部分被去除掉了。通过 Commands 和 Timestamp 我们能够计算出根节点的哈希值,我们可以跟原始的交易的哈希值进行比较,这样我们就能够知道 commands 和 timestamp 是不是属于这笔交易了。