首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Corda oracles验证

Corda oracles验证
EN

Stack Overflow用户
提问于 2018-11-11 21:22:15
回答 1查看 231关注 0票数 0

我试着从github上的一个例子来理解corda oracles是如何工作的。似乎在每个示例中,oracle验证函数都会检查命令中的数据和输出状态中的数据。我不明白为什么应该这样做,因为我们(发布者节点)管理这些数据,并将其置于命令/输出状态。

代码语言:javascript
复制
// 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请求并获取当前值来检查它们吗?

EN

回答 1

Stack Overflow用户

发布于 2018-11-13 00:43:30

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

然而,我们有时需要在事务中包含用于验证的外部数据(公司是否破产、是否发生了自然灾害等)。为此,我们使用一个受信任的oracle,它只在给定数据有效的情况下对事务进行签名。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53249156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档