33个版本

0.10.0 2023年4月26日
0.10.0-alpha.12023年3月24日
0.9.1 2023年4月11日
0.9.0-rc.12022年12月25日
0.5.0 2021年11月23日

#174#wallet

Download history 301/week @ 2024-03-11 435/week @ 2024-03-18 182/week @ 2024-03-25 224/week @ 2024-04-01 125/week @ 2024-04-08 130/week @ 2024-04-15 160/week @ 2024-04-22 94/week @ 2024-04-29 131/week @ 2024-05-06 118/week @ 2024-05-13 113/week @ 2024-05-20 141/week @ 2024-05-27 124/week @ 2024-06-03 155/week @ 2024-06-10 106/week @ 2024-06-17 128/week @ 2024-06-24

每月521 次下载
42 个crate(其中13个直接使用) 中使用

Apache-2.0

130KB
2.5K SLoC

比特币协议基金会库

包含实现比特币协议基础功能的比特币crate集合。

这些是bitcoin crate的替代品,或是对其进行集成的实验。


lib.rs:

比特币脚本类型

比特币在来自不同来源的比特币脚本之间没有做出区分,如交易输出的scriptPubKey或交易输入的witnessscriptSig。还有许多其他可能的比特币脚本容器:赎回脚本、见证脚本、不同版本的taproot叶子比特币脚本。实际上,任何bitcoin::Script类型的“脚本”都可以用于输入和输出。在一个上下文中有效的脚本可能在另一个上下文中无效。这意味着在原则上,使用现有的bitcoin::Script类型,每个输入脚本都可以用作输出脚本,这可能导致开发者不慎编写出有害的代码。

尽管所有 bitcoin::Script 的解析规则相同,即将字节字符串转换为一系列指令(即相同的 语法),但在不同的上下文中(不同的 语义),这些指令的共识意义有多种解释方式。此外,bitcoin_scripts 可以嵌套——或者被提交到其他比特币脚本中——形成多层嵌套结构,如用于 P2SH 的 redeemScriptscriptSig 内部,或来自 witness 字段的 tapScriptwitnessScript 中。这些嵌套层在包含的信息上有所不同,因为其中一些仅提交嵌套 bitcoin_scripts 的哈希(bitcoin::ScriptHashWitnessProgram 或公钥(bitcoin::PubkeyHashbitcoin::WPubkeyHash),而其他则包含脚本的完整源代码。

当前类型系统是解决该问题的方案:通过引入 Script 包装类型来区分不同的逻辑类型。它定义 LockScript 作为脚本的最底层,不包含其他脚本承诺(以它们哈希的形式)。它还定义了其上的类型:PubkeyScript(用于 bitcoin::TxOutscriptPubkey 字段中的内容),SigScript(用于 bitcoin::TxInscriptSig 字段中的内容),RedeemScriptWitnessScript。对于 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