比特币脚本语言的特点及作用介绍

2019-02-27 15:35
未知

  在接下来的介绍中,区块网将研究比特币网络中使用的简单而强大的编码语言。比特币脚本语言(Bitcoin Script)在设计时只考虑了几个功能;它紧凑,图灵不完整,并且基于堆栈。通过这种方式,语言有效且安全地服务于某些目的。

  尽管它的功能非常小,但与以太坊这样的网络相比,它在过去十年中已经证明了自己的强大,足以支持有价值的交易。

  在许多人看来,这种先锋加密货币背后的编程语言就是 Occam s Razor的一个完美例子。

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

  在这一点上,比特币脚本语言的图灵是不完整的。相比之下,Solidity是图灵完备的,这意味着它可以复制任何图灵机或能够自主遵循特定算法的抽象机。掌握了这一概念,人们就可以开始理解智能合约是如何运作的。

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

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

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

  比特币的编码语言使用“反向抛光”作为一种符号系统,意味着“3 + 4”这样的行会随着复杂性的增加而出现“3 4+”。另一项功能可以追溯到比特币脚本的根源“类似Forth”。这个特性之所以相关,是因为这两种语言都是“基于堆栈的”。

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

  “+”操作符获取这两个参数,将它们都从堆栈中弹出,将它们相加,然后将结果推回到堆栈中。(即。, pop, pop, add, push)

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

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

  接下来,此类交易的前两条指令是用于生成该签名的签名和公钥。该信息被标识为“《sig》”和“《pubKey》”,并被推送到堆栈中。Mitchell决定这些价值观,因为他是接受者。交易的前半部分通常称为“scriptSig”或“解锁脚本”。在操作的这一部分中,还引用了以前存在的未使用交易输出(UTXO)。

  UTXO的加入确保了发送者确实拥有他希望发送给Mitchell的比特币的数量。比特币网络通过挖掘器和比特币全节点完成验证。在《掌握比特币》一书中,作者Andreas Antonopoulos这样解释:

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

  交易的第二部分,即“锁定脚本”或“scriptPubkey”,然后由发送者执行。根据上面的图像,下一条指令“OP_DUP”从堆栈中弹出《pubKey》,复制它,然后将它返回给堆栈。

  这个顶值,即《pubKey》的副本,然后由“OP_HASH160”指令进行哈希值加密,并成为“《pubKeyHash》”。

  比特币交易中使用的特定哈希函数称为SHA-256(安全哈希算法),它是更大的函数组SHA-2的一部分,这个函数组是1993年美国国家安全局(National Security Agency)开发的。SHA-2家族的其他成员包括SHA-224、SHA-256、SHA-384和SHA-512,每个数字表示它们生成的消息的位。

  这些应用在信息安全领域非常广泛,其中最相关的是比特币和Haschash的工作量证明(Proof-of-Work, PoW)共识机制。SHA-256最显著的特性是它能够防止上面提到的DoS攻击。

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

  此时,堆栈顶部有两个关键的哈希值数据:作者指定的公钥的哈希值和Mitchell使用的公钥的哈希值。从这里开始使用“OP_EQUALVERIFY”指令,确保发送者确实使用了正确的公钥。在早期经历了几次比特币交易失败后,作者再三检查了Mitchell的公钥。 当公钥匹配时,OP_EQUALVERIFY指令将消耗这些数据点。用户现在只剩下一个签名和一个公钥。最后一步是验证该事务的签名是否正确。

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

  最后的“OP_CHECKSIG”指令,然后将剩余的两项从堆栈中弹出,如果《sig》匹配《pubKey》,则该操作将被呈现为有效。

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

  在此基础上的后续文章将深入探讨数字签名(ECDSA)、多签名操作、付费到脚本哈希值(P2SH)和Timelocks。

责任编辑:mark123