该CHIP提议在Chialisp中增加新的ASSERT条件,包括断言区块高度或时间戳未达到、断言同一区块或spendbundle中发生另一个消费。此外,还增加了断言当前coin在指定区块高度或时间戳被确认的条件,以及确保coin spend是短暂的条件。同时,更新mempool逻辑,使其能够拒绝不再有效的coin spend。这些新条件主要用于实现过期的Offer,避免用户手动取消Offer。
CHIP 编号 | 0014 |
---|---|
标题 | 全新 Chialisp ASSERT 条件 |
描述 | 向 Chialisp 添加新的 ASSERT 条件,并相应地更新 mempool 逻辑 |
作者 | Arvid Norberg |
编辑 | Dan Perry |
评论-URI | CHIPs repo, PR #59 |
状态 | 已完成 |
类别 | 标准追踪 |
子类别 | Chialisp |
创建时间 | 2023-02-22 |
依赖 | 无 |
替换 | 无 |
替代物 | 无 |
Chialisp 语言目前包含条件,以断言已达到某个区块高度或时间戳。 本 CHIP 引入了相反的条件,断言尚未达到某个区块高度或时间戳。 它还包括断言同一区块或 spendbundle 中发生另一笔花费的条件,以及断言当前 coin 在指定的区块高度或时间戳被确认的条件,以及确保 coin 花费是临时的条件。 最后,本 CHIP 引入了新的 mempool 逻辑,如果 pending 的 coin 花费不再有效,则会剔除该花费。
Chialisp 的当前实现包含四个条件,可防止 coin 在某个区块高度或时间戳之前被花费:
条件 | 格式 | 有效条件 | 对比对象 | cmp |
---|---|---|---|---|
ASSERT_SECONDS_RELATIVE | (80 seconds_passed) |
当前区块的时间戳 >= coin 的 birth 时间戳 + seconds_passed |
当前区块 | >= |
ASSERT_SECONDS_ABSOLUTE | (81 seconds) |
当前区块的时间戳 >= seconds |
当前区块 | >= |
ASSERT_HEIGHT_RELATIVE | (82 block_height_passed) |
上一个交易区块的高度 >= coin 的 birth 高度 + block_height_passed |
上一个交易区块 | >= |
ASSERT_HEIGHT_ABSOLUTE | (83 block_height) |
上一个交易区块的高度 >= block_height |
上一个交易区块 | >= |
但是,不存在相反的条件。本 CHIP 提供了一种干净的方法来防止 coin 花费在某个区块高度或时间戳之后执行。
本 CHIP 中引入的条件的主要好处是,它们支持过期的 Offers,从而避免了用户手动取消其 Offers 的需要,例如由于价格滑点。当前 coin 花费在某个区块高度或时间戳之后将不再被允许,并且 mempool 将拒绝此花费。以后可以使用解决方案中的一组新条件创建同一 coin 的新花费。
CLVM 已经允许使用本提案中的条件代码,但是当前没有这些代码的映射。因此,这些条件代码当前被视为 no-op,它们始终通过。本 CHIP 的主要技术挑战是向 mempool 添加逻辑,以拒绝任何使用过期条件的 coin 花费。
本 CHIP 中引入的新 Chialisp 条件是向后兼容的 -- 在实现 CHIP 之后成功的任何调用,之前也都将是成功的 no-op。
但是,将要添加的 Chialisp 条件是不向前兼容的 -- 在实现此 CHIP 之前,可以调用 CLVM 运算符来尝试执行本 CHIP 中未指定的操作。这些调用之前将是成功的 no-op,但是之后它们将不再成功。
由于要添加的条件不向前兼容,因此本 CHIP 将需要 Chia 区块链的软分叉。与所有分叉一样,存在链分裂的风险。软分叉也可能无法被采用。如果足够的节点未升级到包含由本 CHIP 引入的更改,则可能会在分叉的区块高度之前发生这种情况。
我们先前启用过期 Offers 的建议是创建一个单例,该单例在每次花费时都使用 CREATE_COIN_ANNOUNCEMENT
条件。然后,要参与过期 offer 的任何 coin 都将使用 ASSERT_COIN_ANNOUNCEMENT
条件来断言该单例正在同一区块中花费。花费单例之后,Offer coin 将自动失效。
但是,我们已经意识到,对于需要高频交易的情况,此技术是不够的,因为它将需要 coin 花费才能使 Offers 过期。这也是一个不够优雅的解决方案,因为它要求在接受 Offer 时同时花费多个 coin。
本 CHIP 中提出的设计不依赖于任何 coin 花费即可使 Offer 无效。它还仅需要花费单个 coin 即可接受 Offer。
Chia 的 标准交易 使用委托 puzzle,这允许求解器指定他们希望在 coin 被花费时而不是在 coin 被创建时运行的 puzzle 和解决方案。建议在本 CHIP 中引入的新条件用于委托 puzzle 的解决方案中。在新的条件不再有效的情况下,仍可以使用新的解决方案花费 coin。
软分叉将在区块 3 886 635
处激活。它会将以下条件添加到 Chialisp:
条件 | 格式 | 有效条件 | 对比对象 | cmp |
---|---|---|---|---|
ASSERT_CONCURRENT_SPEND | (64 coin_id) |
该 coin 与具有指定 coin_id 的 coin 在同一区块中花费 |
N/A | = |
ASSERT_CONCURRENT_PUZZLE | (65 puzzle_hash) |
该 coin 与至少一个具有指定 puzzle_hash 的 coin 在同一区块中花费 |
N/A | = |
ASSERT_MY_BIRTH_SECONDS | (74 seconds) |
该 coin 的 birth 时间戳与 seconds 相同 |
N/A | = |
ASSERT_MY_BIRTH_HEIGHT | (75 block_height) |
该 coin 的 birth 高度与 block_height 相同 |
N/A | = |
ASSERT_EPHEMERAL | (76) |
该 coin 与其被花费的区块在同一区块中创建 | 当前区块 | = |
ASSERT_BEFORE_SECONDS_RELATIVE | (84 seconds_passed) |
上一个事务区块的时间戳 < 该 coin 的 birth 时间戳 + seconds_passed |
上一个事务区块 | < |
ASSERT_BEFORE_SECONDS_ABSOLUTE | (85 seconds) |
上一个事务区块的时间戳 < seconds |
上一个事务区块 | < |
ASSERT_BEFORE_HEIGHT_RELATIVE | (86 block_height_passed) |
上一个事务区块的高度 < 该 coin 的 birth 高度 + block_height_passed |
上一个事务区块 | < |
ASSERT_BEFORE_HEIGHT_ABSOLUTE | (87 block_height) |
上一个事务区块的高度 < block_height |
上一个事务区块 | < |
此外,此 CHIP 将修改两个现有条件。当前实现(在本 CHIP 之前)在 ASSERT_HEIGHT_*
和 ASSERT_SECONDS_*
检查之间存在差异。时间戳条件与当前区块进行比较,而高度条件与上一个事务区块进行比较。
与上一个事务区块进行比较是故意的,以防止 farmer 有激励来操纵新区块的时间戳。ASSERT_SECONDS_*
条件中与当前区块的比较是无意的。
存在此差异的两个条件是:
当前条件 | 格式 | 有效条件 | 对比对象 | cmp |
---|---|---|---|---|
ASSERT_SECONDS_RELATIVE | (80 seconds_passed) |
当前 区块的时间戳 >= coin 的 birth 时间戳 + seconds_passed |
当前区块 | >= |
ASSERT_SECONDS_ABSOLUTE | (81 seconds) |
当前 区块的时间戳 >= seconds |
当前区块 | >= |
此 CHIP 的软分叉将包括以下对此类条件行为的更新:
更新后的条件 | 格式 | 有效条件 | 对比对象 | cmp |
---|---|---|---|---|
ASSERT_SECONDS_RELATIVE | (80 seconds_passed) |
上一个 区块的时间戳 >= coin 的 birth 时间戳 + seconds_passed |
上一个区块 | >= |
ASSERT_SECONDS_ABSOLUTE | (81 seconds) |
上一个 区块的时间戳 >= seconds |
上一个区块 | >= |
这些更改具有额外的优势 -- 通过更改行为以依赖于上一个区块的时间戳,当这些条件存在于 mempool 中时,也消除了 farmer 为当前区块选择不准确的时间戳的动机。
临时 coin 花费是在同一区块中创建和花费的 coin。coin 的 birth 时间戳与其创建所在的区块的时间戳相同。当前 实现(在本 CHIP 之前)包含以下有关临时 coin 花费的行为:
ASSERT_HEIGHT_RELATIVE 0
将失败,因为上一个事务区块的高度小于当前高度加零。ASSERT_SECONDS_RELATIVE 0
将成功,因为当前区块的时间戳大于或等于当前区块的时间戳加零。如果接受此 CHIP:
ASSERT_HEIGHT_RELATIVE 0
将继续失败;其功能不会改变。ASSERT_SECONDS_RELATIVE 0
将失败,因为上一个区块的时间戳小于当前区块的时间戳加零。尽管消除了 farmer 修改区块时间戳的动机(如 修改后的条件 部分中所述),但对于临时 coin 花费,这种动机仍然存在。这是因为临时 coin 的 birth 时间戳与区块的时间戳相同,并且可以使用负的相对时间戳条件来依赖它。因此,将在此 CHIP 中进行另外两项更改:
ASSERT_EPHEMERAL
条件,该条件在 新条件 部分中列出。此条件将要求 coin 与其被花费的区块在同一区块中创建。另请参阅 安全性 部分中有关此条件的说明。以下 pull request 已作为此 CHIP 的一部分合并到 Chia-Network/chia_rs GitHub 存储库中:
ENABLE_ASSERT_BEFORE
标志以启用对新的 ASSERT
条件的支持ASSERT_CONCURRENT_SPEND
的支持ASSERT_CONCURRENT_PUZZLE
的支持ASSERT_BEFORE_*
中的极端情况ASSERT_MY_BIRTH_HEIGHT
和 ASSERT_MY_BIRTH_SECONDS
的支持ASSERT_EPHEMERAL
条件以下 pull request 已作为此 CHIP 的一部分合并到 Chia-Network/chia-blockchain GitHub 存储库中:
本 CHIP 附带多个安全风险,我们认为所有这些风险都被增加的价值所抵消:
Chia 的区块链可能已经包含未花费的 coin,其 puzzle 包含本 CHIP 中的一个或多个条件。任何此类 coin 都需要在到达分叉点之前花费,否则它们将永久无法花费。但是,我们认为发生这种情况的风险很低,原因有两个:
mempool 将需要额外的逻辑来删除任何不再有效的 coin 花费。这意味着 mempool 需要随着每个交易区块重新计算,从而增加复杂性。这种新的 mempool 逻辑将需要在 Chia 的主网上实施之前进行广泛的测试。
新的 Chialisp 条件可以在 coin 的 puzzle 中使用,而不是按预期在其解决方案中使用。任何 puzzle 包含这些新条件之一的 coin 都需要在条件仍然有效时花费。如果条件变为无效,则 coin 将变为无法花费。由于任何数量的意外原因,都可能发生这种情况,包括:
此外,可以使用在其 puzzle 中使用本 CHIP 条件的 coin 创建它们,以使其始终无效。例如:
100
并且创建了一个 coin,其 puzzle 中包含 (ASSERT_BEFORE_HEIGHT_ABSOLUTE 100)
,则在 coin 创建时,其最后一个有效区块高度已经过去,因此它将永远无法花费。(ASSERT_BEFORE_HEIGHT_ABSOLUTE 100)
和 (ASSERT_HEIGHT_ABSOLUTE 100)
,则它永远无法花费。最后,如果在 coin 的 puzzle 中而不是在其解决方案中使用 ASSERT_EPHEMERAL
条件,则 farmer 可能会选择在新区块中包含 coin 的创建 -- 但不包括临时花费。该 coin 将永远不会再被认为是临时的,因此 ASSERT_EPHEMERAL
条件对于所有将来花费 coin 的尝试都会失败。因此,farmer 将强迫 coin 被破坏。
为了减轻这种风险,我们将强烈建议所有 Chialisp 开发者不要创建任何在其 puzzle 中包含本 CHIP 中任何条件的 coin。使用这些条件的正确方法是在委托 puzzle 的解决方案中。在这种情况下,只有 coin 的当前花费可能会过期,但 coin 本身将保持有效。
过期的 coin 花费可以在 re-org 中变为可花费。这可能会对监视区块链以确定 coin 花费何时变为无效的任何人造成意外的后果。但是,由于在 Chia 中 re-org 很少见,因此不太可能导致任何安全问题。
无
版权及相关权利通过 CC0 放弃。
- 原文链接: github.com/Chia-Network/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!