让我们考虑一个交易生命周期的例子,其中智能合约使用Oracle获取实时更改的外部数据ETH/USD价格馈送。
-
事务在挖掘过程中执行,因此它创建了对Chainlink oracles的请求,该请求返回Price1。Price1是否存储/缓存在区块链上的某个位置?
-
一旦区块被挖掘,挖掘节点就会将其发送给其他以太坊节点进行验证。
-
验证节点也执行该智能合约。随后打电话给Oracle以获得ETH/USD价格会发生什么?Oracle是否会返回";缓存的";在块验证期间响应Price1,否则我们将得到Price2。这是否意味着如果我们得到Price2,那么块验证就会失败?
首先,当您在20c中对表使用区块链选项时,插入的新行将通过计算前一插入行的新链值来进行链接。这些东西存储在隐藏的列中,可以提取,但不能通过更新进行更改。插入后在定义的时间后刚刚删除。现在来看事务:默认情况下,OracleDb是读提交的,并使用分配给执行的每个ddl、dml的SCN。这意味着,当你插入一行时,链值会立即计算出来——这意味着挖掘时的ETH/美元汇率。现在你可以做一个技巧:(1(使用一个名为txscn的列,它存储当前的SCN和txts-TypeDATimestamp以及一个向上计数的序列。当您的验证过程返回时,您插入一个新行,该行将创建一个新的链值,其中包含ETH/USD汇率、(1(中的SCN和当前TIMestamp。这将导致一对行中的每个TX用于验证-如果进程没有返回,则只写入初始行-或者您避免写入第二行,因为验证需要特定的时间。我假设区块链的REST API以相同的方式进行,因为它允许完成的等待时间和TX id;"闪回";当我正确取消测试和文档时,不存在。