33个版本
0.10.0 | 2023年4月26日 |
---|---|
0.10.0-alpha.1 | 2023年3月24日 |
0.9.1 | 2023年4月11日 |
0.9.0-rc.1 | 2022年12月25日 |
0.5.0 | 2021年11月23日 |
#174 在 #wallet
每月521 次下载
在 42 个crate(其中13个直接使用) 中使用
130KB
2.5K SLoC
比特币协议基金会库
包含实现比特币协议基础功能的比特币crate集合。
这些是bitcoin crate的替代品,或是对其进行集成的实验。
lib.rs
:
比特币脚本类型
比特币在来自不同来源的比特币脚本之间没有做出区分,如交易输出的scriptPubKey或交易输入的witness和scriptSig。还有许多其他可能的比特币脚本容器:赎回脚本、见证脚本、不同版本的taproot叶子比特币脚本。实际上,任何bitcoin::Script
类型的“脚本”都可以用于输入和输出。在一个上下文中有效的脚本可能在另一个上下文中无效。这意味着在原则上,使用现有的bitcoin::Script
类型,每个输入脚本都可以用作输出脚本,这可能导致开发者不慎编写出有害的代码。
尽管所有 bitcoin::Script
的解析规则相同,即将字节字符串转换为一系列指令(即相同的 语法),但在不同的上下文中(不同的 语义),这些指令的共识意义有多种解释方式。此外,bitcoin_scripts 可以嵌套——或者被提交到其他比特币脚本中——形成多层嵌套结构,如用于 P2SH 的 redeemScript 在 scriptSig 内部,或来自 witness 字段的 tapScript 在 witnessScript 中。这些嵌套层在包含的信息上有所不同,因为其中一些仅提交嵌套 bitcoin_scripts 的哈希(bitcoin::ScriptHash
,WitnessProgram
或公钥(bitcoin::PubkeyHash
,bitcoin::WPubkeyHash
),而其他则包含脚本的完整源代码。
当前类型系统是解决该问题的方案:通过引入 Script
包装类型来区分不同的逻辑类型。它定义 LockScript
作为脚本的最底层,不包含其他脚本承诺(以它们哈希的形式)。它还定义了其上的类型:PubkeyScript
(用于 bitcoin::TxOut
的 scriptPubkey
字段中的内容),SigScript
(用于 bitcoin::TxIn
的 scriptSig
字段中的内容),RedeemScript
和 WitnessScript
。对于 Taproot,我们定义 LeafScript
为特定脚本分支的最高级别(参见 bitcoin::util::psbt::TapTree
)和 crate::TapScript
为当前 0xC0
tapleaf 版本语义的类型,该语义由 BIP-342 定义。
存在转换函数,例如,可以分析 PubkeyScript
并判断它是否是自定义脚本或P2PK,如果满足条件则返回一个 LockScript
类型,否则会报错。这些转换函数位于 convert
模块中。因此,通过这种类型系统,用户可以始终确定它包含哪些语义信息。
类型转换
LockScript -+-> (PubkeyScript + RedeemScript) -+-> SigScript
| +-> WitnessScript
+-> PubkeyScript
|
TapScript ----> LeafScript
PubkeyScript --?--> LockScript
依赖项
~11MB
~157K SLoC