解码比特币脚本:数字货币背后的编程语言

介绍

比特币常被称为可编程货币。其数字化特性为用户提供了在定义使用资金的条件方面的更大灵活性。

在讨论比特币时,谈话通常围绕钱包和币。然而,更准确的概念是将钱包视为钥匙,将币视为支票,而区块链则是一个安全的保险库。每个保险库都有一个狭窄的开口,可以插入支票或检查内容。进入保险库本身仍然限制在拥有正确钥匙的人。

当密钥持有者希望转移资金时,他们会解锁保险库。这个过程涉及创建一个新的支票,引用原始的(并使其无效),并将其安全存放在仅供预定接收者访问的保险库中。新的接收者在支出这些资金时遵循相同的步骤。

本文探讨了比特币脚本——比特币网络中的节点用来控制这些数字保险库的锁定和解锁机制的编程语言。

比特币的交易机制

根据我们的类比,每笔比特币交易由两个基本组成部分构成:一个用于保险库访问的密钥(和一个锁。密钥解锁包含您希望转移的支票的保险库,而新的支票则被放置在另一个用不同锁安全保护的保险库中。从这个新保险库访问资金需要另一个特定的密钥。

该系统提供了显著的灵活性。网络支持多种锁定类型 - 有些保险库可能需要多个密钥,而其他保险库可能需要访问权限的证明。用户可以根据他们的具体需求定制多种条件。

在技术术语中,密钥被称为 scriptSig,而锁被称为 scriptPubKey。经过仔细检查,这些组件显现为数据片段和代码块的组合,共同形成一个紧凑的程序。

在交易执行期间,这个组合在网络中传播。每个接收节点验证交易的有效性。验证失败将导致资金不可访问。

这些检查)coins(在技术上被称为未花费交易输出)UTXOs(。任何拥有适当密钥的用户都可以利用这些资金。具体来说,scriptSig充当密钥,而scriptPubKey作为锁。

如果您的钱包包含UTXO,它们可能带有一个条件,规定只有能够证明拥有特定公钥的个人才能解锁相关资金。要解锁它们,您必须提供一个使用与scriptPubKey中指定的公钥相对应的私钥进行数字签名的scriptSig。

比特币堆叠基础知识

脚本作为一种基于堆栈的语言。指令按垂直列排列,执行从顶部元素开始。例如,元素A、B和C形成一个堆栈,C在顶部,A在底部。在执行指令时,操作从堆栈的顶部元素开始。

元素在执行过程中被添加到栈中并从栈中“弹出”。

数据元素 ) 如签名、哈希和公钥( 与指令 ) 或操作码( 不同。指令删除数据并对其执行操作。考虑这个简化的例子:

<检查 if=“” equal=“”>

数据以红色显示,操作码以蓝色显示。从左到右,字符串首先进入堆栈。操作码 )假设为此示例(然后移除堆栈顶部元素)(并应用MD5哈希,将结果推送回堆栈:d16fb36f0911f878998c136191af705e。

接下来, 进入堆栈,导致出现两个相同的元素。最后, 移除顶部的两个元素并进行比较,如果相同则将 <1> 推入堆栈,如果不同则推入 <0> 。

到达指令列表的末尾后,脚本验证遵循两个规则:如果剩余元素为null或由于未满足条件而导致指令失败,则发生失败。在这个例子中,两个条件都不适用 - 我们有一个非空元素 )<1>(,确认脚本有效性。这些相同的规则适用于实际的比特币交易。

支付到公钥 )P2PK(

Pay-to-Pubkey )P2PK( 代表最基本的交易形式。它将资金锁定到特定的公钥。通过这种方式接收资金时,接收者必须向发送者提供他们的公钥,而不是比特币地址。

2009年,中本聪与Hal Finney之间的第一次交易使用了P2PK。这种结构在比特币早期非常常见,但在很大程度上已被Pay-to-Pubkey-Hash )P2PKH(所取代。

P2PK的锁定脚本遵循简单的格式: OP_CHECKSIG。顾名思义,OP_CHECKSIG根据提供的公钥验证签名。相应的scriptSig仅包含。

执行过程再简单不过:签名进入栈中,然后是公钥。OP_CHECKSIG 检查这两个元素,并根据公钥验证签名。如果匹配,<1> 将被添加到栈中;否则,<0> 出现。

P2PK 已经不再被使用,原因将在下一节中探讨。

支付至公钥哈希 )P2PKH(

Pay-to-Pubkey-Hash )P2PKH( 代表了比特币网络中最普遍的交易类型。现代钱包软件通常默认实现这种格式。

P2PKH scriptPubKey 遵循以下结构:

OP_DUP OP_HASH160 <公钥=“” hash=“”> OP_EQUALVERIFY OP_CHECKSIG

在检查相应的 scriptSig 之前,让我们了解一下涉及的操作码:

) OP_DUP

OP_DUP 移除顶部元素,创建一个副本,并将两个版本都推送回栈中。这使得在保留原始元素的同时对副本进行操作成为可能。

OP_HASH160

此操作码移除栈顶元素,并应用双重哈希:首先进行 SHA-256 哈希,然后对 SHA-256 输出进行 RIPEMD-160 哈希。生成的哈希返回到栈中。

OP_EQUALVERIFY

OP_EQUALVERIFY 结合了两个操作:OP_EQUAL 和 OP_VERIFY。OP_EQUAL 移除两个元素并检查其是否相同,如果相同则推送 <1>,如果不同则推送 <0>。OP_VERIFY 移除顶部元素并验证其真假值 ###non-null(。作为 OP_EQUALVERIFY 结合在一起时,如果顶部两个元素不匹配,则会导致交易失败。

相应的scriptSig结构是:

<公钥=“”>

解锁P2PKH输出需要提供有效的签名及其对应的公钥。

该过程建立在P2PK执行流程的基础上,增加了对提供的公钥与脚本中嵌入的哈希值匹配的验证。

一个重要的区别:在 P2PKH 锁定脚本中,公钥保持隐藏 - 只显示其哈希。在区块链浏览器中检查未花费的 P2PKH 输出不会显示公钥信息。只有当收款人转移资金时,密钥才会变得可见。

这种方法提供了几个优点。首先,公钥哈希比完整的公钥提供了更紧凑的传输——这促使了中本聪在2009年的实现。这些公钥哈希构成了用户交换的比特币地址。

其次,公钥哈希引入了一个额外的安全层,以防御量子计算威胁。由于公钥在消费发生之前保持隐藏,因此确定相应的私钥变得更加困难。任何攻击都需要逆转两个连续的哈希操作)RIPEMD-160和SHA-256(。

BTC0.01%
查看原文
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 评论
  • 转发
  • 分享
评论
0/400
暂无评论
交易,随时随地
qrCode
扫码下载 Gate App
社群列表
简体中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)