主页 > imtoken苹果版钱包 > 12.比特币脚本语言简介

12.比特币脚本语言简介

imtoken苹果版钱包 2023-10-23 05:14:21

在下面的介绍中,BlockNet 将研究比特币网络中使用的简单而强大的编码语言。比特币脚本的设计只考虑了几个功能;它是紧凑的、图灵不完备的和基于堆栈的。通过这种方式,该语言可以有效且安全地服务于某些目的。

尽管功能非常小比特币简介,但与以太坊等网络相比,它已证明自己足够强大,可以在过去十年中支持有价值的交易。

比特币脚本和“可编程货币”

在许多人看来,这种开创性加密货币背后的编程语言是奥卡姆剃刀的完美例子。

它是基本的,甚至与前加密货币编码语言相比也是如此。更重要的是,中本聪通过设计设计了这种简单性。具有多种功能并允许复杂数据事务的语言还允许更多的攻击向量。批评者解释说,像 Solidity 这样的语言虽然在范围上令人印象深刻,但在安全性方面却不尽如人意。

至此,比特币脚本语言的图灵是不完整的。相比之下,Solidity 是图灵完备的,这意味着它可以复制任何自动遵循特定算法的图灵机或抽象机。有了这个概念,人们就可以开始理解智能合约是如何工作的了。

回到主要焦点,比特币脚本语言不提供这个功能,更深入的研究使用比特币区块链的智能合约将是后面文章的主题。

比特币的主要用例一直是加密货币及其价值转移。因此,图灵完备语言的附加属性是不必要的。但是,这并不意味着脚本是有限的。

此外,比特币脚本语言的限制阻止了无限循环被包含在任何单个交易中。此限制消除了对网络进行拒绝服务 (DoS) 攻击的可能性。这些约束的范围,例如事务不仅向 X 和 Y 发送值,将在后面的部分中讨论。

比特币脚本语言的特点

比特币的编码语言使用“反向抛光”作为符号系统,这意味着像“3 + 4”这样的行随着复杂度的增加而显示为“3 4+”。另一个特性可以追溯到比特币脚本的根源——“Forth-like”。这个特性是相关的,因为这两种语言都是“基于堆栈的”。

堆栈是一种非常常见的数据结构,用 Andreas Antonopolous 的话来说,它允许将信息“推送”或“弹出”到“堆栈顶部”。前者解释了将信息添加到堆栈的过程,而后者描述了从堆栈中删除信息的过程。此外,信息弹出或推送的顺序遵循“后进先出”的原则。

像“34+”这样的操作表现如下:

将“3”按到堆栈上。

将“4”按到堆栈上。

"+" 运算符接受两个参数,将它们从堆栈中弹出,将它们相加,然后将结果推回堆栈。(即,弹出、弹出、添加、推送)

在此示例中,结果操作导致堆栈上出现“7”并且程序终止。

在比特币脚本语言中,操作将遵循相同的步骤,但还会在每个变量之前包含前缀“OP”。接下来让我们看看这些新词如何在真实的比特币交易中组合在一起。

比特币脚本语言正在运行

大多数操作都是签名交易。这包括支付、交换以及大多数涉及公钥和私钥的工作。让我们分开发送者和他的同事 Eddie Mitchell 之间的通信。在这里,发送方将指定 Mitchell(接收方)的公钥,Mitchell 将通过使用相同公钥指定签名来赎回发送的比特币。

接下来,此类交易的前两条指令是用于生成该签名的签名和公钥。此信息被标识为“”和“

, 并被压入堆栈。米切尔决定这些价值观,因为他是接受者。交易的前半部分通常被称为“scriptSig”或“解锁脚本”。在这部分操作中,还引用了以前存在的不安全使用交易输出(UTXO)。

添加 UTXO 可确保发送者确实拥有他希望发送给 Mitchell 的比特币数量。比特币网络由矿工和比特币全节点验证。在 Mastering Bitcoin 中,作者 Andreas Antonopoulos 是这样解释的:

每个输入都包含一个解锁脚本并引用一个预先存在的 UTXO。验证软件将复制解锁脚本,检索输入引用的 UTXO,并从该 UTXO 复制锁定脚本。

交易的第二部分,“锁定脚本”或“scriptPubkey”,然后由发送者执行。根据上图,从堆栈中弹出下一条指令“OP_DUP”

,复制它,并将其返回到堆栈中。

OP_DUP 指令

这个最高值,就是

复制,然后通过“OP_HASH160”指令进行哈希加密,变为“

”。

pubKeyHash

比特币交易中使用的特定散列函数称为 SHA-256(安全散列算法),它是更大的函数组 SHA-2 的一部分比特币简介,该函数由国家安全局于 1993 年创建并开发。SHA-2 系列的其他成员包括 SHA-224、SHA-256、SHA-384 和 SHA-512,其中每个数字代表它们生成的消息的一部分。

这些应用在信息安全领域非常广泛,其中最相关的就是比特币和Hashash的工作量证明(PoW)共识机制。SHA-256 最显着的特点是它能够防止上述 DoS 攻击。

回到发送者和他的同事之间的交易,用户仍然需要向堆栈中添加另一条数据。下一条信息是作者在交易开始时指定的公钥。需要生成一个签名来赎回所请求的比特币。

此时,栈顶有两个密钥散列数据:作者指定的公钥散列和米切尔使用的公钥散列。使用此处的“OP_EQUALVERIFY”命令确保发件人确实使用了正确的公钥。在早期经历了几次失败的比特币交易后,作者再次检查了米切尔的公钥。当公钥匹配时,OP_EQUALVERIFY 指令将消耗这些数据点。用户现在只剩下一个签名和一个公钥。最后一步是验证交易的签名是否正确。

签名和公钥堆栈

比特币脚本语言在这里有一个优势,因为它不需要从庞大的库中提取来确认签名的有效性。所有这些都内置在语言中。

最后的“OP_CHECKSIG”指令,然后从堆栈中弹出剩余的两项,如果它们匹配

,该操作将变为有效。

比较、对比和增加复杂性

虽然上面的介绍很简短,但它应该提供有关如何执行比特币交易的基本概念。从那里,开发人员和爱好者可以开始尝试更高级的操作,这将是稍后简要介绍的主题。

以此为基础的后续文章将深入研究数字签名 (ECDSA)、多重签名操作、支付脚本哈希 (P2SH) 和时间锁。