我试着从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)
}在本例中,state从oracle获取第N个质数,但是在发出之后,验证函数不会重新运行generateNth质数函数来确保这个数字确实是我们需要的数字。我知道这个例子中的数据是确定性的,因为第N个质数不能改变,但是如果我们有像股票价值这样的动态数据呢?oracle验证函数不是也应该发送另一个http请求并获取当前值来检查它们吗?
发布于 2018-11-13 00:43:30
首先,请注意,Corda中的契约不能以任何方式访问外部世界(DB读取、HTTP请求等)。如果他们可以,交易有效性将是不确定的。在第n天被发现有效的事务可能在第n+1天变得无效(因为数据库行发生更改,或者网站关闭等)。这将导致关于给定事务是否为有效分类帐更新的分歧。
然而,我们有时需要在事务中包含用于验证的外部数据(公司是否破产、是否发生了自然灾害等)。为此,我们使用一个受信任的oracle,它只在给定数据有效的情况下对事务进行签名。
我们可以将信息嵌入到输入或输出状态中。但是,这需要我们将整个输入或输出状态显示给oracle进行签名。因此,出于隐私原因,最好将数据嵌入到只包含oracle感兴趣的数据的命令中,这样我们就可以过滤掉事务的所有其他部分,并且只将该命令提供给oracle进行签名。
oracle通常会执行DB读取或发出HTTP请求,以在签名之前检查数据的有效性。
https://stackoverflow.com/questions/53249156
复制相似问题