数值结果 DLC

该文档整合了数值结果压缩、赔付曲线规范,并引入了舍入区间,详细说明了数值结果DLC的CET构建、适配器签名和签名验证的完整流程。通过数值分解,对结果的每一位进行签名压缩,并结合赔付曲线和确定性舍入方法,优化了合约的执行效率和信息传递,同时解决了可能出现的精度差异问题。

数字结果 DLCs

简介

本文档结合了 数字结果压缩赔付曲线 规范,以及独立引入的 舍入间隔 ,以指定 CET 的完整过程 构建、适配器签名和数字结果 DLC 的签名验证。

当处理枚举结果时,DLC 只需要一个 nonce,并且合约执行 交易 (CET) 使用单个 oracle 证明进行声明。 此方案生成的 DLC 包含每个可能结果的唯一适配器签名,这 只有在可能结果的数量可管理的情况下才可行。

如果结果可以是很大范围内的任何数字,则使用简单的枚举 此范围内的所有可能数字都很笨拙。 我们通过使用数字分解来优化这种情况,其中 oracle 单独签署结果的每一位 这样,许多可能的结果可以压缩 到单个适配器签名中,通过忽略某些数字。

我们还压缩了传达所有结果所需的信息,因为这通常可以被视为 赔付曲线 仅由几个数字参数化,这些数字决定了整个可能域的赔付。

最后,我们引入了一种确定性舍入方法,允许 DLC 参与者增加数字 在他们愿意在赔付中允许一些额外舍入误差的地方进行结果压缩。

我们将所有这些部分放在一起,以指定 CET 计算、适配器签名和数字结果 DLC 的签名验证程序。

本规范以及 赔付曲线数字结果压缩 规范主要关注 协议级别的确定性再现和简洁的通用高级信息通信。 这些文档不太可能涉及应用程序级别和 UI/UX 开发人员,他们应该在其自己的抽象级别上操作,仅将应用程序级别的信息编译成此处指定的格式 在与最低级别的核心 DLC 逻辑交互时。

目录

舍入间隔

正如 数字结果压缩文档 中详细介绍的那样,任何时候域的某些连续间隔导致恒定的 赔付值,我们可以压缩该间隔所需的适配器签名,使其大小与使用每个结果一个适配器相比呈对数关系 间隔上的签名。 因此,舍入赔付函数的输出可能是有益的,以允许通过恒定赔付间隔对赔付曲线的各个部分进行有界近似。 例如,如果双方都愿意将赔付值四舍五入到最接近的 100 聪,他们可以显着节省 执行其合同所需的适配器签名的数量。 为此,我们允许各方协商可以在曲线上变化的舍入间隔,允许在更近处进行更少的舍入 可能的结果,并允许在极端情况下发生更多舍入。

每一方都有其自己的最小 rounding_intervals,并且在给定 event_outcome 处使用的舍入是最小值 双方的舍入模数。

如果 R 是用于给定 event_outcome 的舍入模数,并且该 event_outcome 的函数评估结果是 value, 那么在该方的 CET 输出中使用的金额将是 value - (value % R)value - (value % R) + R 中更接近的一个,如果在平局的情况下则向上舍入。

参考实现
舍入间隔序列化
  1. 数据:
    • [bigsize:num_rounding_intervals]
    • [u64:begin_interval_1]
    • [u64:rounding_mod_1]
    • ...
    • [u64:begin_interval_num_rounding_intervals]
    • [u64:rounding_mod_num_rounding_intervals]

num_rounding_intervals 是此函数中指定的舍入间隔数,可以是 零,在这种情况下,到处都使用 1 的舍入模数。 每个序列化的舍入间隔由两个 u64 整数组成。

第一个整数称为 begin_interval,指的是此范围开始时的 x 坐标 (event_outcome)。 第二个整数称为 rounding_mod,包含在此范围内使用的舍入模数。

如果 begin_interval_1 严格大于 0,则 0begin_interval_1 之间的间隔的精度为 1

要求
  • begin_interval_1(如果存在)必须为非负数。
  • begin_interval 必须严格递增。

合约执行交易计算和签名

给定 offerrer 的 赔付函数、一个 total_collateral 金额和 舍入间隔,我们希望计算一个数字前缀对列表 (即整数数组)和 Satoshi 值。 然后,这些对中的每一对都将转换为 CET,用于签名的适配器点是 从数字前缀计算得出,并且 其输出值将等于 Satoshi 赔付额和 total_collateral 减去该赔付额。

我们必须首先通过应用舍入来修改给我们的纯函数(例如,通过插值点),然后将所有 将负赔付额设置为 0,并将所有高于 total_collateral 的计算赔付额设置为等于 total_collateral

接下来,我们将函数域划分为两种间隔:

  1. 修改后的函数值恒定的间隔。
  2. 修改后的函数的值在每个点都在变化的间隔。

这可以通过在域中的每个点评估修改后的函数并跟踪值是否已更改来构建间隔来完成,但这并不是一个特别有效的解决方案。 有无数种方法可以使此过程更有效,例如二进制搜索函数值的变化或查看未修改函数的导数。

无论如何计算这些间隔,都要求恒定值的间隔尽可能大。 例如,如果你有两个具有相同值的连续恒定值间隔,则必须合并这些间隔。

最后,一旦计算出这些间隔,数字结果压缩 算法将在每个恒定值间隔上运行 它生成一个数字前缀(整数列表),该前缀与该间隔的(常量)赔付配对。 每个间隔只需要一个 CET(因为这些间隔具有恒定的赔付),其中每个间隔都接收多个适配器签名。

下图说明了从所有可能结果的域和修改后的赔付曲线开始的整个过程,然后 按赔付额划分为恒定值的间隔(红色),运行数字结果压缩以获得数字前缀,将这些前缀转换为 为它们间隔的 CET 的适配器点,最后使用这些适配器点在其相应的 CET 上创建适配器签名。

CET 和适配器签名构造

合约执行交易签名验证

要验证在 dlc_acceptdlc_sign 消息中给出的 CET 的适配器签名,请执行 上述过程 来计算对列表 数字数组和赔付值以构建 CET 及其适配器点,然后运行 adaptor_verify 函数。

但是,如果 adaptor_verify 导致验证失败,请勿终止 CET 签名验证过程。 相反,你必须查看你是向上舍入(到 value - (value % rounding_mod) + rounding_mod) 或向下(到 value - (value % rounding_mod))。 如果你向上舍入,则计算因向下舍入而产生的 CET 和适配器点;如果你向下舍入,则计算 CET 和适配器点 从向上舍入产生。 使用新的适配器点针对此新 CET 调用 adaptor_verify 函数,如果它通过验证,则认为该适配器签名 有效并继续。

此额外步骤是必需的,因为无法将确定性浮点计算引入到此规范中,而不会也 引入远大于整个规范的数量级的复杂性。 这是因为硬件、操作系统或编程语言编译器均未提供任何保证,即两次执行相同的 浮点计算将产生相同的结果。 因此,本规范改为采取以下立场:客户端必须能够承受机器之间精度差异(相差 1 * rounding_mod)。

作者

Nadav Kohen <nadavk25@gmail.com>

知识共享许可协议 <br> 本作品已获得 知识共享署名 4.0 国际许可 的许可。

  • 原文链接: github.com/discreetlogco...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
discreetlogcontracts
discreetlogcontracts
江湖只有他的大名,没有他的介绍。