#条件 #Chia #硬币 #区块链 #共识 #mempool #高度

chia-consensus

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

7 个版本 (重大变更)

新增 0.12.0 2024 年 8 月 14 日
0.11.0 2024 年 8 月 7 日
0.9.0 2024 年 5 月 23 日
0.8.0 2024 年 5 月 14 日
0.6.1 2024 年 3 月 26 日

#1903 in 神奇豆子

Download history 176/week @ 2024-04-22 3/week @ 2024-04-29 143/week @ 2024-05-13 146/week @ 2024-05-20 29/week @ 2024-05-27 83/week @ 2024-06-03 25/week @ 2024-06-10 9/week @ 2024-06-24 23/week @ 2024-07-01 38/week @ 2024-07-22 12/week @ 2024-07-29 174/week @ 2024-08-05

224 次每月下载
5 个crate中使用(4 个直接使用)

Apache-2.0

760KB
18K SLoC

实现说明

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

解释整数

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

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

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

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

0 的相对高度条件

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

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

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

列表NIL终止符

期望从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个参数。其他任何内容都是条件失败。

去重相同的花费

在mempool中去重相同花费的功能只能与没有任何AGG_SIG_MEAGG_SIG_UNSAFE条件的花费一起工作。因为在一般情况下,签名不能从聚合签名中减去。这个功能只在满足这些条件时才激活。

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

当运行生成器时,符合去重条件的花费在Spend对象中以布尔值标记。

依赖关系

~9-16MB
~278K SLoC