Oracle(中介)价格新报价
永续交易的StarkEx使用外部Oracle中介价格信息源,以便在业务逻辑中包括最新价格。 在这里,我们描述了新价格经历的过程。 该过程开始于应用程序获得由Oracle(中介价格)签名的价格更新时, 然后,应用程序汇总已签名的价格,并将其作为Oracle Price Tick(中介价格新报价)请求发送给StarkEx。 StarkEx检验请求的有效性,并最终将新价格打包到批处理中。
如果您对Oracle价格(中介价格)的合理性感兴趣,我们建议您阅读链上配置。 其中包含授权谁来签名新价格以及所需签名数的更多信息。

‌第一步:应用程序收集有关价格的签名

‌在系统中注册的Oracle(中介价格)提供者(有关注册的详细信息请参阅此页面),可以在assetId.资产ID 的价格更新上签名。 此更新由以下元组(price, time, name)(价格,时间,名称)表示,其中price(价格)表示新价格,time(时间)是更新的时间戳,name(名称)是assetId.资产ID 和oracle身份的唯一标识符。 有关如何生成价格信息源的详情,请阅读此处
‌该应用程序汇总这些签名,并将Oracle Price Tick(中介价格新报价)交易发送给StarkEx,该交易包括以下内容:
● 新的system_time(系统时间)
● 价格已更新的assetId资产ID列表。
● 对于列表中的每个assetId资产ID,它将发送一个包含(price, time, name, sig)(价格,时间,名称,签名)列表以及current_price(目前-价格)将被用作StarkEx下一个交易的事实。

第二步:价格被打包在批处理中,StarkEx验证批处理

StarkEx并不在所有Oracle Price Ticks(中介价格新报价)中明确证明所有Oracle(中介)签名的有效性,因为这样做没有效率。而是使用混合方法。 StarkEx在批处理标头中为每个assetId(资产ID)包含全部法定人数的签名,以证明批次中的最低和最高价格。 对于其余价格,StarkEx仅证明它们在最低价格和最高价格之间。
由于应用程序已经可以处理交易顺序和/或混合并匹配来自不同合法oracle(中介)源的不同签名以创建各种可能的中间值,因此这种优化不会降低系统的安全性。
我们将继续描述批量验证的两个阶段。 第一阶段是对整个批次执行,第二阶段是根据每一次Oracle Price Tick(中介价格新报价)交易执行的。
● 价格是列表的中位数
(price1,,pricen) (price_1,\dots, price_n)
  • nconfig[assetId].quorumn \geq \text{config[assetId].quorum}
    n≥配置[assetId].法定人数
● 对于每个元组
i{1,...,n}i \in \{1,...,n\}
sigisig_i
is 是拥有唯一公钥的有效签名
pkipk_i
来自列表config[assetId].keys , 在元组
(pricei,timei,namei)(price_i,time_i, name_i)
nameiname_i
(名称I出现在列表上)config[assetId].names
● 列表中的每一个值
(time1,,timen)(time_1,\dots, time_n)
是在price_validity_period价格-有效性-期限--时间窗口,此外
min(time1,,timen)\min(time_1,\dots, time_n)
最小时间batch_starting_time - price_validity_period 至少是
批处理-开始-时间 -价格-有效性-期限
max(time1,,timen)\max (time_1,\dots, time_n)
最大时间
max(time1,,timen)\max (time_1,\dots, time_n)
最多是batch_end_time 批处理-结束-时间

第一阶段:StarkEx验证批处理中的最低和最高价格

对于每个assetId资产ID (包括在该批次中未收到更新的资产),StarkEx会验证minimal_price最低_价格和maximal_price最高_价格。 这是通过验证以下证明每个Oracle Price Tick(中介价格新报价)的条件来完成的。 请记住,一个Oracle(中介)价格波动包含n个元组组成的列表
(pricei,timei,namei,sigi)(price_i,time_i, name_i, sig_i)
.
● 价格是列表的中位数(price1,…,pricen) (价格1,…,价格n)
● n≥配置[资产ID ].法定人数
● 对于每个元组
i{1,...,n}i \in \{1,...,n\}
sigisig_i
is 是拥有唯一公钥的有效签名
pkipk_i
来自列表config[assetId].keys , 在元组
(pricei,timei,namei)(price_i,time_i, name_i)
nameiname_i
(名称I出现在列表上)config[assetId].names
● 列表中的每一个值
(time1,,timen)(time_1,\dots, time_n)
(是在一个24小时的窗口)此外
min(time1,,timen)\min(time_1,\dots, time_n)
最小时间是至少要比batch_starting_time批处理开始时间少一天
max(time1,,timen)\max (time_1,\dots, time_n)
最大时间是最多是batch_end_time批处理-结束-时间

第二阶段:StarkEx分别验证每个Oracle(中介)价格新报价的有效性

‌对于批处理中的每个Oracle Price Tick(中介价格新报价),StarkEx都会验证以下条件:
  • system_time >= prev system_time 系统_时间> =上一个系统时间
  • 针对每一个 assetId:
current_price目前_价格大于或等于该批次的minimal_price最低_价格
current_price目前_价格小于或等于此批次的maximal_price最高-价格