#condition #coin #consensus #height #mempool #byte #challenge

chik-consensus

Chik区块链全节点使用的实用函数和类型

6 个版本 (破坏性更新)

0.10.0 2024年7月11日
0.9.0 2024年7月10日
0.8.0 2024年5月16日
0.7.0 2024年5月15日
0.6.1 2024年4月15日

#296 in 魔法豆

Download history 258/week @ 2024-04-15 313/week @ 2024-05-13 17/week @ 2024-05-20 5/week @ 2024-06-03 6/week @ 2024-06-10 240/week @ 2024-07-08 7/week @ 2024-07-15 19/week @ 2024-07-29

每月266次下载
3 crate 中使用

Apache-2.0

750KB
18K SLoC

实现说明

这里是一些在其他实现中可能容易出错的特殊情况。

整数解释

在将 SpendBundle 输出的条件中的原子解释为整数时,允许前导零以及扩展 0xff 字节。

作为一个优化,所有负整数要么立即失败(例如作为硬币价值)要么将条件变成永真(始终为真)(例如作为高度或时间条件)。在后一种情况下,整个条件可以简单地忽略。

这留下了有效的前导零的正整数。条件中的整数总是限制在32或64位,但考虑到前导零,原子可能比这大得多。这开启了一个拒绝服务挑战。要使实现扫描和忽略前导零足够高效以对抗此类攻击并非易事。因此,mempool将拒绝返回带有任何冗余前导零的条件的 Spend Bundles。(注意,有时为了使整数成为正数,可能需要单个前导零。这不算作冗余)。

此条件解析和检查的实现足够健壮,可以抵御这种攻击,目前只有农民可以发起攻击(因为内存池拒绝了非农民的攻击)。

0的相对高度条件

与一些具有负参数的条件是重言式一样,一些具有0参数的条件也是如此。例如:ASSERT_SECONDS_RELATIVEASSERT_SECONDS_ABSOLUTEASSERT_HEIGHT_ABSOLUTE

列表中明显缺少的是ASSERT_HEIGHT_RELATIVE。0的相对高度条件仍然可以阻止在同一个区块中花费该币(作为一个临时币)。ASSERT_HEIGHT_RELATIVE条件要求币的创建和花费之间的区块高度差超过参数(在这种情况下为0)。

这有点不一致,因为0的ASSERT_SECONDS_RELATIVE确实允许在同一个区块中花费该币。区块中的所有花费都是同时发生的,所以花费之间的时间差不超过0,而是等于0。

列表空终止符

期望Spend Bundle或区块生成程序的输出是

(
  (
    (*parent-coin-id* *puzzle-hash* *amount*   # <- identify the coin to be spent
      (
        (
          (*condition-code* *condition-args...*)  # <- first condition
          ... # more conditions here. Must have valid terminator
        )
        *future-extensions*
      )
    )
    ... # more spends here, must have valid terminator
  )
   *future-extensions*
)

其中一些列表必须以NIL原子结束,而其他则宽容地解析,只需列表以右侧的任何原子结束即可。

需要NIL终止的列表

  1. 花费列表(即识别要花费的币及其条件)
  2. 条件列表

不需要NIL终止的列表

  1. 花费的外部列表,旨在允许未来的扩展
  2. 条件的外部列表,旨在允许未来的扩展
  3. 条件参数列表

NIL终止符是一个长度为0的原子,用作列表末尾的右侧元素。

(A . (B . (C . ())))

不需要NIL终止符的列表可以以任何类型的原子结束。例如。

(A . (B . (C . 8)))

条件附加参数

允许向条件添加附加参数,并忽略它们。这是为了留出空间供未来扩展。一个例外是AGG_SIG_UNSAFEAGG_SIG_ME条件。它们都要求恰好2个参数。其他任何内容都是条件失败。

去重相同的花费

在内存池中去重相同花费的功能只能与没有AGG_SIG_MEAGG_SIG_UNSAFE条件的花费一起工作。因为在一般情况下无法从聚合签名中减去签名。只有当这些条件得到满足时,该功能才是激活的

  • 该花费没有输出AGG_SIG_MEAGG_SIG_UNSAFE条件。
  • 该花费使用相同的解决方案。

在运行生成器时,在Spend对象中用布尔值标记可以用于去重的花费。

依赖项

~11–18MB
~327K SLoC