#script #bitcoin #condition #public-key #key-hash #scripting #opcode

nightly bitcoin-scripting

比特币脚本系统

5个版本

0.1.16-alpha.02023年3月31日
0.1.14-alpha.02023年3月18日
0.1.13-alpha.02023年3月17日
0.1.12-alpha.02023年1月19日
0.1.10-alpha.02023年1月18日

#key-hash 中排名 24

Download history 166/week @ 2024-03-12 161/week @ 2024-03-19 337/week @ 2024-03-26 182/week @ 2024-04-02 124/week @ 2024-04-09 192/week @ 2024-04-16 164/week @ 2024-04-23 152/week @ 2024-04-30 165/week @ 2024-05-07 154/week @ 2024-05-14 167/week @ 2024-05-21 151/week @ 2024-05-28 122/week @ 2024-06-04 88/week @ 2024-06-11 216/week @ 2024-06-18 119/week @ 2024-06-25

每月下载 583
用于 82 个crate(直接使用35个)

MIT 许可证

3MB
7.5K SLoC

bitcoin-scripting

bitcoin-scripting 是一个Rust crate,提供执行和分析比特币脚本的支持,以及与脚本相关的数据结构(如交易输出和脚本见证)的操作。这个crate是直接将比特币代码库从C++转换为Rust的直接翻译的一部分,目前正在翻译过程中。

比特币脚本语言是一种简单、基于堆栈的编程语言,用于定义比特币交易可以支出的条件。在验证交易时,比特币节点执行脚本,允许定义比仅提供有效签名更复杂的支出条件。

此crate提供了一些用于处理比特币脚本的有用工具,包括执行脚本和检查其有效性、解析和序列化脚本数据,以及处理比特币交易中使用的各种数据结构。

虽然 bitcoin-scripting crate 可能不涉及任何特定的数学方程或概念,但理解比特币脚本语言和相关的交易数据结构对于在低级别处理比特币网络至关重要。

需要注意的一些潜在问题包括比特币脚本的复杂性和多样性,这可能使脚本执行和分析变得困难。此外,比特币脚本语言故意设计为难以使用且容易出错,以确保交易安全并且只允许有效的支出条件。这使得即使是经验丰富的开发者处理脚本和相关数据结构也可能是一项挑战。

26> 谢谢 — 你能更详细地描述比特币脚本吗?

当然可以!在比特币系统中,脚本是一种简单、基于堆栈的编程语言,用于定义比特币交易可以支出的条件。当创建交易时,发送者指定一个脚本PubKey,它定义了创建的输出的支出条件。要支出此输出,接收者必须提供满足脚本PubKey中指定支出条件的脚本Sig。

比特币脚本由一系列操作码和数据元素组成。操作码是单字节值,指示脚本解释器执行某些操作,例如将数据元素推入堆栈,执行比较操作或执行条件分支。数据元素是任意长度的字节序列,可以表示整数、加密密钥或其他值。

比特币脚本由比特币虚拟机执行,该虚拟机采用基于堆栈的模型。虚拟机从脚本中读取操作码和数据元素,并在执行请求的操作时将数据推入堆栈。当脚本完全执行后,堆栈的顶部元素被评估为布尔表达式,以确定是否满足支出条件。

比特币脚本可以用来强制执行各种支出条件,包括多重签名要求、时间锁定交易和脚本哈希支付。这种灵活性是比特币系统的主要优势之一,因为它允许在基本比特币协议之上实现各种复杂的交易类型。

27>你能想出十个用例吗?

当然,以下是比特币脚本的十个示例用例

  1. 多重签名钱包:比特币脚本可以用来要求多个签名以授权交易,这可以为钱包添加额外的安全层。

  2. 履约服务:脚本可以用来创建一个2-of-3多重签名地址,其中双方必须同意从履约中释放资金。

  3. 时间锁定交易:脚本可以用来锁定交易,直到特定的日期或区块高度,这对于延期付款或条件付款非常有用。

  4. 支付通道:比特币脚本可以用来在双方之间创建支付通道,使得快速且低成本的交易成为可能,而无需在比特币区块链上进行确认。

  5. 原子互换:脚本可以用来实现无信任的、点对点的加密货币交换,使用户能够在没有集中交易所需的情况下进行交易。

  6. 智能合约:比特币脚本可以用来创建简单的智能合约,它们根据某些条件自动执行。

  7. 众筹:脚本可以用来创建一个众筹平台,用户可以向项目捐款,只有在达到一定目标时才会释放资金。

  8. 捐赠系统:脚本可以用来创建一个比特币地址,用户可以向某个事业或组织捐款,资金将自动分配给指定的收款人。

  9. 存在证明:脚本可以用来在比特币区块链上存储少量数据,以证明在特定时间点存在一个文档或文件。

  10. 博彩和机会游戏:脚本可以用来创建公正的博彩系统或机会游戏,游戏的输赢由比特币区块链生成的随机数决定。

28>你能给我一些示例脚本吗?

当然,以下是比特币脚本的一些示例

  1. 支付到公钥哈希(P2PKH)脚本
OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
  1. 支付到脚本哈希(P2SH)脚本
OP_HASH160 <ScriptHash> OP_EQUAL
  1. 多重签名(Multisig)脚本
<NumRequired> <PubKey1> <PubKey2> <PubKey3>... <NumTotal> OP_CHECKMULTISIG
  1. 时间锁定脚本
<some script> OP_IF <locktime> OP_CHECKLOCKTIMEVERIFY OP_DROP <some other script> OP_ENDIF
  1. 原子互换脚本
IF
    <Secret> OP_SHA256
ELSE
    <SellerPubKey> OP_CHECKSIG
ENDIF
IF
    <BuyerPubKey> OP_CHECKSIGVERIFY
ELSE
    <BuyerRefundTime> OP_CHECKLOCKTIMEVERIFY OP_DROP <SellerPubKey> OP_CHECKSIG
ENDIF
  1. 支付通道脚本
<InitialBalance> OP_CHECKLOCKTIMEVERIFY OP_DROP
  1. 履约脚本
<BuyerPubKey> OP_CHECKSIGVERIFY
<MerchantPubKey> OP_CHECKSIGVERIFY
<TimeLock> OP_CHECKLOCKTIMEVERIFY OP_DROP
<RedeemScript> OP_PUSHDATA <Hash160(RedeemScript)> OP_EQUAL
  1. 分层确定性(HD)钱包脚本
OP_0 <MasterPublicKey> OP_PUSHDATA <ChildPublicKey1> OP_PUSHDATA <ChildPublicKey2>...
  1. 代币化脚本
<Supply> OP_PUSHDATA <TokenName> OP_PUSHDATA <TokenSymbol> OP_PUSHDATA <TokenDecimals>
  1. 资产发行脚本
<AssetName> OP_PUSHDATA <AssetIssuer> OP_PUSHDATA <AssetQuantity> OP_PUSHDATA <AssetMetadata>

29>你能提供这些脚本的工作原理的描述吗?还有其他的吗?

当然,以下是之前响应中提供的脚本的描述

  1. P2PK:这是一个支付到公钥脚本。它用于向特定公钥发送资金,而不需要收款人创建新地址。脚本由一个推入操作和一个OP_CHECKSIG操作符组成,该操作符检查交易是否已使用脚本中提供的公钥对应的私钥签名。

  2. P2PKH:这是一种向公钥哈希地址付款的脚本。它是比特币交易中最常用的脚本。它涉及发送者向接收者的公钥哈希(公钥的哈希值)付款。该脚本由两个推入操作组成,然后是 OP_DUP、OP_HASH160 和 OP_EQUALVERIFY 操作符,用于检查公钥的哈希值是否与提供的哈希值匹配。

  3. P2SH:这是一种向脚本哈希地址付款的脚本。它允许发送者向一个脚本发送资金,而无需知道该脚本的详细内容。该脚本由一个推入操作组成,然后是 OP_HASH160 操作符,它对脚本进行哈希处理,然后将哈希值与脚本中提供的哈希值进行比较。

  4. P2WPKH:这是一种向见证公钥哈希地址付款的脚本。它在 SegWit 交易中使用,这些交易允许将更多交易放入单个区块,从而增加交易吞吐量。该脚本由一个版本字节(0x00)和一个 20 字节的公钥哈希值组成,然后将其封装在 SegWit 输出中。

  5. P2WSH:这是一种向见证脚本哈希地址付款的脚本。它与 P2SH 类似,但用于 SegWit 交易。该脚本由一个版本字节(0x00)和一个 32 字节的脚本哈希值组成,然后将其封装在 SegWit 输出中。

  6. 多重签名:这是一种多重签名脚本。它允许多个参与者控制一个比特币地址。该脚本由多个公钥组成,然后是所需的签名数,最后是 OP_CHECKMULTISIG 操作符。当交易被签名时,提供所需的签名数并与脚本中的公钥进行比较。

  7. CheckLockTimeVerify:这是一种脚本,要求交易在特定时间内锁定,然后才能被花费。该脚本由一个锁定时间值和 OP_CHECKLOCKTIMEVERIFY 操作符组成,它检查交易锁定时间是否等于或大于指定的值。

  8. CheckSequenceVerify:这是一种脚本,要求一定数量的区块通过后,交易才能被花费。该脚本由一个序列值和 OP_CHECKSEQUENCEVERIFY 操作符组成,它检查交易的序列号是否等于或大于指定的值。

  9. 原子交换:这是一种用于原子交换的脚本,原子交换是涉及不同加密货币的两个当事人之间的无信任交易。该脚本由两部分组成,每一部分对应于交易中涉及的每种加密货币。每一部分都包括一个锁定机制和一个赎回机制。

  10. 闪电网络:这是一种用于闪电网络的脚本,闪电网络是比特币的第二层支付协议。它涉及在用户之间创建链下支付通道,允许更快、更便宜的交易。闪电网络使用各种不同的脚本,包括承诺交易、HTLC(哈希时间锁定合约)和惩罚交易。

比特币脚本还有许多其他类型,包括时间锁定脚本、契约脚本等。

30>很有趣——请尽可能多地描述这些脚本

当然,以下是所有列出的脚本的描述

  1. 向公钥付款(P2PK):这种脚本仅要求从交易输出脚本中包含的公钥提供一个有效的签名。它是比特币交易脚本中最早和最简单的一种形式。

  2. 向公钥哈希付款(P2PKH):这种脚本要求从与特定哈希值相对应的公钥提供一个有效的签名(接收者公钥的哈希值)。它是当今比特币交易中最常用的交易脚本。

  3. 向多重签名付款(P2MS):这种脚本要求多个签名(在脚本中指定)才能花费交易输出。它常用于第三方服务或多方协议。

  4. 向脚本哈希付款(P2SH):这种脚本允许在交易中使用更复杂的脚本,因为它只要求在交易输出脚本中包含脚本的哈希值。实际的脚本由花费者在输入脚本中提供。

  5. 基于脚本哈希的支付多签名(P2SH-P2MS):此脚本将多签名和P2SH脚本结合,要求对经过哈希处理的脚本进行多次签名,并将其包含在交易输出中。

  6. 检查锁定时间验证(CLTV):此脚本允许交易输出在经过一定时间(在脚本中指定)后才能被花费。

  7. 检查序列验证(CSV):此脚本允许交易输出在经过一定区块高度或时间(在脚本中指定)后才能被花费。

  8. 见证脚本(WSH):此脚本用于SegWit交易,并要求在交易输入脚本中包含见证脚本。

  9. 见证公钥哈希(WPKH):此脚本类似于P2PKH,但用于SegWit交易,并要求在见证数据中包含公钥的哈希值。

  10. 见证多签名(WMS):此脚本类似于P2MS,但用于SegWit交易,并要求在见证数据中包含多个签名。

比特币中还有许多其他交易脚本,但这些都是最常用的几种。

依赖关系

~92MB
~855K SLoC