【发布时间】: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 收到的n和nth prime创建的。如果没有从查询 github.com/corda/oracle-example/blob/… 获得相同的第 n 个素数,Oracle 将不会签署 Tx。 -
对于您的股票,您可能必须将其存储在 Oracle 的数据库中,您将在签署 tx 之前验证股票价格实际上是 oracle 提供的东西,或者进行另一个 http 调用来验证那时的价格与命令中的价格相同,然后才签署 Tx。
-
您必须明白,合同上有效的东西并不意味着它是有效的交易。另一方,即预言机也必须同意。如果 Tx 不是 Oracle 看到的那样。这是一个无效的 Tx,不会签署 Tx。如您所见,Oracle 的签名是强制性的,如果他不提供签名,则 tx 将失败。
标签: corda