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 神奇豆子
224 次每月下载
在 5 个crate中使用(4 个直接使用)
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终止的列表
- 花费列表(即标识要花费的代币以及条件)
- 条件列表
不需要NIL终止的列表
- 花费的外部列表,以便允许未来的扩展
- 条件的外部列表,以便允许未来的扩展
- 条件参数列表
NIL终止符是一个长度为0的原子,用作列表末尾的右侧元素。
(A . (B . (C . ())))
不需要NIL终止符的列表可以以任何类型的原子结束。例如。
(A . (B . (C . 8)))
条件附加参数
允许向条件添加附加参数,并将它们忽略。这是为了留出空间供未来扩展。一个例外是AGG_SIG_UNSAFE
和AGG_SIG_ME
条件。它们都需要恰好2个参数。其他任何内容都是条件失败。
去重相同的花费
在mempool中去重相同花费的功能只能与没有任何AGG_SIG_ME
或AGG_SIG_UNSAFE
条件的花费一起工作。因为在一般情况下,签名不能从聚合签名中减去。这个功能只在满足这些条件时才激活。
- 花费没有输出
AGG_SIG_ME
或AGG_SIG_UNSAFE
条件。 - 花费使用相同的解决方案。
当运行生成器时,符合去重条件的花费在Spend
对象中以布尔值标记。
依赖关系
~9-16MB
~278K SLoC