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 魔法豆
每月266次下载
在 3 crate 中使用
750KB
18K SLoC
实现说明
这里是一些在其他实现中可能容易出错的特殊情况。
整数解释
在将 SpendBundle 输出的条件中的原子解释为整数时,允许前导零以及扩展 0xff
字节。
作为一个优化,所有负整数要么立即失败(例如作为硬币价值)要么将条件变成永真(始终为真)(例如作为高度或时间条件)。在后一种情况下,整个条件可以简单地忽略。
这留下了有效的前导零的正整数。条件中的整数总是限制在32或64位,但考虑到前导零,原子可能比这大得多。这开启了一个拒绝服务挑战。要使实现扫描和忽略前导零足够高效以对抗此类攻击并非易事。因此,mempool将拒绝返回带有任何冗余前导零的条件的 Spend Bundles。(注意,有时为了使整数成为正数,可能需要单个前导零。这不算作冗余)。
此条件解析和检查的实现足够健壮,可以抵御这种攻击,目前只有农民可以发起攻击(因为内存池拒绝了非农民的攻击)。
0的相对高度条件
与一些具有负参数的条件是重言式一样,一些具有0参数的条件也是如此。例如:ASSERT_SECONDS_RELATIVE
、ASSERT_SECONDS_ABSOLUTE
、ASSERT_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终止的列表
- 花费列表(即识别要花费的币及其条件)
- 条件列表
不需要NIL终止的列表
- 花费的外部列表,旨在允许未来的扩展
- 条件的外部列表,旨在允许未来的扩展
- 条件参数列表
NIL终止符是一个长度为0的原子,用作列表末尾的右侧元素。
(A . (B . (C . ())))
不需要NIL终止符的列表可以以任何类型的原子结束。例如。
(A . (B . (C . 8)))
条件附加参数
允许向条件添加附加参数,并忽略它们。这是为了留出空间供未来扩展。一个例外是AGG_SIG_UNSAFE
和AGG_SIG_ME
条件。它们都要求恰好2个参数。其他任何内容都是条件失败。
去重相同的花费
在内存池中去重相同花费的功能只能与没有AGG_SIG_ME
或AGG_SIG_UNSAFE
条件的花费一起工作。因为在一般情况下无法从聚合签名中减去签名。只有当这些条件得到满足时,该功能才是激活的
- 该花费没有输出
AGG_SIG_ME
或AGG_SIG_UNSAFE
条件。 - 该花费使用相同的解决方案。
在运行生成器时,在Spend
对象中用布尔值标记可以用于去重的花费。
依赖项
~11–18MB
~327K SLoC