Corda Oracles验证

时间:2018-11-11 13:22:15

标签: corda

我试图从github上的示例中了解Corda oracles的工作方式。似乎在每个示例中,oracle验证功能都会检查命令中的数据和输出状态中的数据。我不明白为什么这应该起作用,因为我们(发布者节点)管理该数据并将其置于命令/输出状态。

// Our contract does not check that the Nth prime is correct. Instead, it checks that the
// information in the command and state match.
override fun verify(tx: LedgerTransaction) = requireThat {
    "There are no inputs" using (tx.inputs.isEmpty())
    val output = tx.outputsOfType<PrimeState>().single()
    val command = tx.commands.requireSingleCommand<Create>().value
    "The prime in the output does not match the prime in the command." using
            (command.n == output.n && command.nthPrime == output.nthPrime)
}

在此示例中,状态从oracle获取第N个素数,但是在发出该函数后,验证函数不会重新运行generateNth素数函数以确保此数字确实是我们所需的那个。我理解此示例中的数据是确定性的,因为第N个素数不能更改,但是如果我们拥有动态数据(如股票价值)怎么办? oracle验证功能是否还应该发送另一个http请求并获取当前值进行检查?

1 个答案:

答案 0 :(得分:0)

首先,请注意,Corda中的合同无法以任何方式(数据库读取,HTTP请求等)访问外部世界。如果可能的话,交易有效性将是不确定的。在第 n 天被发现有效的交易可能在第 n + 1 天变得无效(因为数据库行已更改或网站关闭等)。这将导致对于给定交易是否是有效的分类账更新存在分歧。

但是,有时我们需要进行交易以包含外部数据以进行验证(公司是否破产,自然灾害是否发生,等等)。为此,我们使用一个仅在给定数据有效的情况下才对交易进行签名的受信任的Oracle。

我们可以将信息嵌入输入或输出状态。但是,这将要求我们向oracle显示整个输入或输出状态以进行签名。出于隐私原因,因此最好将数据嵌入仅包含oracle感兴趣的数据的命令中,以便我们可以过滤掉事务的所有其他部分,并且仅将此命令提供给oracle进行签名。

oracle 通常执行数据库读取或发出HTTP请求以在签名之前检查数据的有效性。