主页 > imtoken怎么用 > 比特币区块链(八) | 比特币中的脚本系统

比特币区块链(八) | 比特币中的脚本系统

imtoken怎么用 2023-01-16 20:35:45

在本文中,我们将全面演示比特币交易脚本语言的各个组件;同时,我们还将演示如何使用它来表达复杂的使用条件,以及解锁脚本如何满足这些消费条件。全文将按如下结构展开:

全文结构化脚本语言

比特币客户端通过执行以验证比特币交易的语言编写的脚本来执行类似 Forth 的脚本。锁定脚本写入 UTXO,它通常包含用相同脚本语言编写的签名。当比特币交易被验证时,每个输入值中的解锁脚本与其对应的锁定脚本同时执行(互不干扰),看交易是否满足使用条件。

如今,通过比特币网络处理的大多数交易都基于名为“P2PKH”(Pay-to-Public-Key-Hash)的脚本。然而,使用脚本锁定输出和解锁输入意味着比特币交易可以通过使用编程语言包含无限数量的条件。当然,比特币交易不仅限于“P2PKH”。

1.脚本语言简介

比特币交易脚本系统,也称为脚本,是一种基于反向波兰表示法的基于堆栈的执行语言。脚本是一种功能简单的编程语言,旨在在有限的硬件上执行。

脚本也称为基于堆栈的编程语言,因为在运行时,它使用的数据结构称为堆栈,也称为堆栈。堆栈只允许两个操作,push 和 pop。推入是将一个项目添加到顶部,弹出是从堆栈顶部移除一个项目。脚本通过从左到右处理每个项目来执行脚本。

2.脚本语言的特点

为什么选择一种脚本语言来执行比特币交易?那是因为脚本的天然特性,既符合交易的要求,又避免了一些不必要的麻烦。在介绍图灵不完备性的时候,我们先说一下图灵完备性。谈图灵完备,首先得谈图灵机。

图灵机:又是一个确定性图灵机。它是英国数学家图灵提出的一种抽象计算模型。图灵机由控制器、可无限延伸的皮带和在皮带上左右移动的读写头组成。这种概念上简单的机器理论上可以计算任何直观可计算的函数。因此,图灵机是一种通用的物理机器,具有无限的存储容量,能够计算任何直观可计算的函数。下图展示了图灵机的基本组成部分。

图灵机

如果一系列操作数据的规则(例如指令集、编程语言)可以用来模拟一个单波段图的智能机,那么它就是图灵完备的。图灵完备性通常是指“具有无限存储容量的通用物理机器或编程语言”。图灵完备性意味着你的编程语言可以做图灵机能做的所有事情,并且可以解决所有可计算的问题。

图灵不完备性是一种通用的物理机器或编程语言,不能解决所有可计算性问题。

比特币脚本语言有很多特性,但它们都以一种重要的方式指定——没有循环或其他条件的流量控制,而不是复杂的流量控制功能。这保证了脚本语言的图灵不完备性,这意味着脚本的复杂性是有限的,事务可以执行的次数是可预测的。脚本不是通用语言比特币的应用特征,施加这些限制是为了确保该语言不能用于创建无限循环或其他类型的逻辑炸弹,这些逻辑炸弹可以植入交易中,通过导致拒绝服务来攻击比特币 互联网受限语言防止交易激活机制被用作薄弱环节。

比特币交易脚本语言是非主权的比特币的应用特征,没有机构可以覆盖脚本,也没有机构会在脚本执行后保存。因此,执行脚本所需的所有信息都已包含在脚本中。可以预见,脚本可以在任何系统上以相同的方式执行。如果你的系统验证了一个脚本,你可以确信比特币网络中的每个其他系统也会验证它,这意味着一个有效的交易对每个人都有效,每个人都明白这一点。这种结果的可预测性是比特币系统的一个重要的良性特征。

比特币的应用特征_比特币的概念和特征_比特币分叉会影响比特币价格吗

3.脚本构建

比特币的交易验证引擎依赖于两种类型的脚本来验证比特币交易:锁定脚本和解锁脚本。

锁定脚本是放置在输出值上的“屏障”,它指定了将来使用输出的条件。由于锁定脚本通常包含一个公钥(即比特币地址),因此也称为脚本公钥代码。

解锁脚本是“解决”或满足锁定脚本在输出上设置的支出条件的脚本,同时允许消耗输出。解锁脚本是每笔比特币交易输出的一部分,通常包含用户比特币钱包生成的数字签名(通过用户的私钥)。由于解锁脚本通常包含数字签名,因此它曾经被称为 ScriptSig。但并非所有解锁脚本都会包含签名。

在当今的比特币世界中,锁定脚本和解锁脚本在堆栈通过时分别执行,以验证每笔交易的过程。下图显示了在一种常见的比特币交易类型中,在验证之前连接的解锁和锁定脚本的组合。

解锁脚本-锁定脚本

4.脚本执行

脚本语言通过从左到右处理每个项目来执行脚本。数字(常量)被压入堆栈,操作员将一个或多个参数压入或删除堆栈,处理它们。条件运算符评估条件并产生真或假结果。例如,OP_EQUAL 从堆栈中删除两项,如果相等则推入 true(表示为 1),如果不相等则推入 false(表示为 0))。比特币交易脚本通常是条件运算符,当交易有效时,会产生一个真实的结果。下图是脚本语言“2 3 ADD 5 EQUAL”的执行过程。

p>

比特币脚本执行示例

脚本“2 3 OP_ADD 5 OP_EQUAL”演示了算术加法运算符OP_ADD,它将两个数相加并将结果压入堆栈,OP_EQUAL是在计算前检查两个数之和是否等于5。

5.解锁和锁定脚本分开执行

在比特币客户端的原始版本中,unlock 和 lock 脚本存在于一个链中,并按顺序执行。出于安全原因,比特币开发者在 2010 年修改了这个功能——因为存在“允许异常解锁脚本将数据推送到堆栈并污染锁”。在当前方案中,这两个脚本与堆栈传输一起单独执行。具体执行条件如下。

比特币的应用特征_比特币分叉会影响比特币价格吗_比特币的概念和特征

首先,使用堆栈执行引擎执行解锁脚本。如果解锁脚本在执行过程中没有报错,复制主栈(不是备份栈),执行锁脚本。如果使用从解锁脚本复制的堆栈数据执行锁定脚本的结果为“TRUE”,则解锁脚本将成功满足锁定脚本设置的条件,因此输入是使用此 UTXO 的有效授权。如果合并脚本后的结果不是“TRUE”,则输入无效,因为它不能满足UTXO中设置的使用资金的条件。

标准交易

在比特币最初几年的发展过程中,开发者对脚本类型设置了一些限制。这些限制被编译成一个 Standard() 函数,该函数定义了五种标准事务。截至目前,五个标准的交易脚本是客户端唯一使用的,并且大部分都运行客户端矿工接受的脚本。五个标准脚本分别是P2PKH、P2PK、MS(限15键)、P2SH和OP_Return,下面会详细介绍。

1.@ > P2PKH(Pay-to-Public-Key-Hash)

PKH,公钥哈希。比特币网络上的大部分交易都是 P2PKH 交易,其中包含一个锁定脚本,该脚本通过公钥哈希实现阻塞输出功能,也就是众所周知的比特币地址。 P2PKH 脚本锁定的输出可以通过键入公钥来锁定。密钥和相应私钥创建的数字签名被解锁。

P2PKH 示例

在一笔交易中,Bob 向 Alice 支付了 0.15BTC。

因为比特币中没有账户的概念,所以这次交易的输出没有写爱丽丝的名字,也没有写爱丽丝的公钥,而是写了爱丽丝的公钥。哈希值。这样,进一步保证了用户的隐私。 Alice 想要花掉这 0.15 个 BTC,她应该如何证明她拥有这个 UTXO,并且其他人不能冒充 Alice 来花费这个 UTXO?

答案是比特币交易产生的输出不是一个简单的公钥地址,而是一个脚本。在 Bob 向 Alice 支付 0.15 BTC 的交易中,Bob 创建了一个输出脚本,类似于:

OP_DUP OP_HASH160 OP_EQUAL OP_CHECKSIG

这个脚本意味着,谁可以提供签名和公钥让这个脚本运行通过,谁可以花费这个交易的0.15 BTC。由于只能使用 Alice 的私钥创建签名,因此非 Alice 的私钥创建的签名不会通过此脚本的验证,因此其他人无法冒充 Alice 进行这笔交易。

锁脚本的解锁脚本为:

结合这两个脚本可以形成一个有效的组合脚本如下:

OP_DUP OP_HASH160

公钥散列> OP_EQUAL OP_CHECKSIG

比特币的概念和特征_比特币的应用特征_比特币分叉会影响比特币价格吗

只有解锁版脚本符合锁定版脚本的设置条件时,组合有效脚本执行时结果才会显示为真(Ture)。即只有在解锁脚本获得了Alice的有效签名后,才会传递交易执行结果(结果为真)。

下图展示了组合脚本验证交易有效性的分步流程。

关于“消费比特币需要数字签名”的误解

当 Bob 向 Alice 支付比特币时,我非常困惑。既然 Bob 要用自己的比特币,为什么他没有看到他使用自己的签名和公钥?

在原始交易中,交易的组成部分包括交易输入和交易输出。 Bob 的私钥和公钥在交易中用于交易输入的解锁脚本中。交易的交易输出的输出脚本是一个锁脚本。锁定脚本要求只能解锁 Alice 的签名和公钥。所以比特币从 Bob 转移到 Alice。

总结一下,从脚本的角度来解释一下事务,事务就是:解开之前的锁脚本,新建一个锁脚本。

2. P2PK(Pay-to-Public-Key)

与 P2PKH 相比,P2PK 模式更简单。与包含公钥哈希的P2PKH模式不同,在P2PK脚本模式下,公钥本身已经存储在锁脚本中,代码长度也更短。 P2PKH 是由 Satoshi 创建的,其主要目的是一方面使比特币地址更短,另一方面更易于使用。 P2PK 目前是 Coinbase 交易中最常见的。

P2PK锁版脚本格式为:

OP_CHECKSIG

用于解锁的脚本是一个简单的签名:

通过交易验证软件确认的组合脚本为:

OP_CHECKSIG

比特币的应用特征_比特币的概念和特征_比特币分叉会影响比特币价格吗

这个脚本只是简单调用CHECKSIG算子,主要是验证签名是否正确,如果正确则返回true(Ture)。

3.多重签名

多重签名脚本设置了这样一个条件,如果脚本中记录的公钥数量为N,则至少可以解锁M个公钥中的一个。这也称为 M-N 组合,其中 N 是脚本中记录的公钥总数,M 是使多重签名有效的公钥阈值(最小数量)。

例如2-3多重签名组合,存档的公钥数量为3个,至少同时使用2个或更多个来生成激活交易的签名。资金需要经过验证才能使用。

M-N多重签名锁定脚本的一般形式为:

M

...

N OP_CHECKMULTISIG

其中 N 是文件中的公钥总数,M 是激活交易所需的最小公钥数。

2-3个多重签名条件:

2

3 OP_CHECKMULTISIG

上面的lock脚本可以通过包含签名和公钥Unlock的脚本来执行:

OP_0

或通过 3 个存档公钥的任意 2 个匹配的私钥签名组合解锁。

比特币的概念和特征_比特币分叉会影响比特币价格吗_比特币的应用特征

这两个脚本的组合会形成一个验证脚本:

1.1@>

执行时,只有当脚本的解锁版本与解锁脚本的条件匹配时,组合脚本才会显示结果为True(Ture)。上例中对应的设置条件是解锁后的脚本中是否包含与三个公钥中任意两个一致的私钥的有效签名。

4.数据记录输出

比特币的去中心化特性和时间戳记账机制,即区块链技术,其潜在应用将超越支付领域。区块链技术具有交易脚本语言的安全性和可恢复性优势。每个人都知道比特币是现存最成功的应用之一。那么我们可以使用比特币这种可以在区块链中存储交易数据的技术,来存储一些与比特币支付无关的数据吗?

在众多争议中,最终通过在 0.9 版本的 Bitcoin Core 客户端上采用 Return 运算符实现了妥协。 Return 允许开发人员在交易输出中添加 80 字节的非交易数据。此类交易的主要目的是扩展比特币网络中的功能。例如,电子指纹可免于文件记录。任何人都可以通过此机制在特定日期建立文件存在证明。

5. P2SH(Pay-to-Script-Hash)

P2SH 的一个重要特性是它可以将脚本哈希编译成地址(其定义见 BIP0013 /BIP-11.5@>。P2SH 地址是一个 20 字节的 Base58 编码脚本哈希,就像比特币地址是一个带有 20 字节哈希的 Base58 编码的公钥。

因为 P2SH 地址以 5 为前缀,这导致 Base58 编码的地址以“3”开头。 P2SH 地址隐藏了所有复杂性,因此使用它们付款的人不会看到脚本。

P2SH 的优势

与直接使用复杂脚本锁定输出相比,P2SH具有以下特点:

P2SH 是作为一种新的、强大的交易类型引入的,它极大地简化了复杂的交易脚本。进一步说明P2SH的必要性。有关 P2SH 的更多功能将在后续系列文章中介绍。

1.6@>

参考资料:

精通比特币-第一版-第5章-交易

精通比特币-第二版-第七章-高级脚本和交易

比特币脚本命令分析

廖雪峰——深入理解比特币脚本