【问题标题】:Corda oracles verificationCorda 预言机验证
【发布时间】:2019-04-14 09:45:03
【问题描述】:

我试图通过 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请求并获取当前值来检查它们吗?

【问题讨论】:

  • 您正在查看的验证功能是合约的功能。如果创建命令中指定的第 N 个质数是正确的,即等于使用 query 方法获得的第 n 个质数,oracle 只会对事务进行签名,因为它是确定性的,每次都相同。 Create 命令是使用从 Oracle 收到的 nnth prime 创建的。如果没有从查询 github.com/corda/oracle-example/blob/… 获得相同的第 n 个素数,Oracle 将不会签署 Tx。
  • 对于您的股票,您可能必须将其存储在 Oracle 的数据库中,您将在签署 tx 之前验证股票价格实际上是 oracle 提供的东西,或者进行另一个 http 调用来验证那时的价格与命令中的价格相同,然后才签署 Tx。
  • 您必须明白,合同上有效的东西并不意味着它是有效的交易。另一方,即预言机也必须同意。如果 Tx 不是 Oracle 看到的那样。这是一个无效的 Tx,不会签署 Tx。如您所见,Oracle 的签名是强制性的,如果他不提供签名,则 tx 将失败。

标签: corda


【解决方案1】:

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

但是,我们有时需要在交易中包含外部数据以进行验证(公司是否破产、是否发生自然灾害等)。为此,我们使用受信任的预言机,该预言机仅在给定数据有效时才签署交易。

我们可以将信息嵌入到输入或输出状态中。但是,这将要求我们向预言机透露整个输入或输出状态以进行签名。出于隐私原因,因此最好将数据嵌入到只包含预言机感兴趣的数据的命令中,这样我们就可以过滤掉交易的所有其他部分,只将该命令呈现给预言机进行签名。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多