Script:用通俗易懂的方式讲解比特币智能合约语言

本文介绍了比特币的脚本语言Script,它是一种基于堆栈的语言,用于验证交易的安全性,解释了Script的工作原理,包括ScriptPubKey和ScriptSig的概念,以及如何使用OP_CODE进行验证, 另外,还介绍了常见的比特币地址类型,以及SegWit如何修复延展性问题,提高交易安全性,同时,还提到了为了安全,比特币禁用了某些OP_CODE。

Script — 比特币智能合约语言的通俗解释

你知道比特币在每笔交易中都隐藏着自己的编程语言吗?它被称为 Script,虽然它看起来不像我们通常使用的编程语言,但它默默地支持着比特币在网络上的安全转移。在这篇文章中,我将用简单的术语分解 Script,它做什么,为什么它避免某些功能,以及它如何保证比特币的安全。

什么是比特币的 Script?

安全地锁定和解锁代币的能力是我们用来转移比特币的机制,而实现这一点的语言称为 Script。 Script 是一种基于堆栈的语言,类似于 Forth,比特币使用它来安全地验证交易,并确保在将其挖掘到区块链上之前已正确授权。

我之前提到过,比特币避免某些技术标准,其中之一是 图灵完备性

编程语言中的图灵完备性本质上意味着该程序具有循环的能力,并且我们知道循环在编程中是有用的。

在编写 Script 语言时,有意省略了图灵完备性。这是因为任何人(我的意思是任何具有正确技术知识的人)都可以创建一个 Script 程序,比特币网络上的每个完整节点都将执行该程序。

考虑到这一点,如果有人意外或故意导致循环持续运行,这将本质上创建一个 拒绝服务 (DoS) 攻击。一个带有无限循环的 Script 程序可能会使比特币瘫痪,这将是一个很大的系统漏洞,因此为了确保这种情况不会发生,比特币的智能合约语言避免了图灵完备性。

Script 中的验证

使用 Script 在比特币中验证交易的基础是结合以下 2 个独立的脚本:

  1. ScriptPubKey (脚本公钥):ScriptPubKey 本质上就像一个锁箱,钱要存入其中,只有特定的密钥才能打开;即 ScriptSig。锁定的比特币由比特币持有者进行的交易放置在那里。如果用户 A 向用户 B 发送比特币(进行交易),用户 A 将比特币锁定在 ScriptPubKey 中,并将其发送给用户 B;只有用户 B 拥有使用其唯一 ScriptSig 解锁 ScriptPubKey 以花费代币的密钥。ScriptPubKey 是从交易的先前输出(你可以称之为余额)中获得的。
  2. ScriptSig (脚本签名):ScriptSig 是用于证明锁箱所有权的密钥,然后授权花费代币。

Script 的内部运作

Script 像大多数编程语言一样,一次处理一个命令,而命令只能是以下两种之一:元素操作

操作通常被称为 OP_CODE(操作码)。每个 OP_CODE 代表比特币 Script 解释器的特定指令。一些 OP_CODE 将数据/元素推送到堆栈,而另一些则操作堆栈并执行检查。请注意,当 Script 处理命令时,它会将命令推送到 堆栈

堆栈按照先进后出的原则运行

为了使脚本在堆栈中有效,堆栈中的最后一个元素必须是 1

元素的例子包括:

  • 公钥
  • 签名
  • 赎回脚本
  • ScriptSig
  • ScriptPubKey

比特币操作码的例子包括:

  • OP_DUP:从堆栈中获取 1 个元素并复制它
  • OP_HASH160:从堆栈中获取 1 个元素,对该元素执行哈希运算,并返回该元素的哈希等价物
  • OP_CHECKSIG:从堆栈中获取 2 个元素(公钥和签名),并返回 1 或 0,表示脚本是否有效
  • OP_EQUAL:获取 2 个元素并返回 1 或 0
  • OP_0:将零推入堆栈
  • OP_1:将一推入堆栈
  • OP_16:将 16 推入堆栈

这是一个将被推入堆栈的脚本示例,<pubkey> — 公钥,OP_CHECKSIG — 用于检查 <signature> 是否与 <pubkey> 匹配的操作码

这是一个将被推入堆栈的脚本示例。

签名 Signature 已被推入堆栈。

<pubkey> — 公钥已被推入堆栈

OP_CHECKSIG — 使用公钥验证签名,如果有效则返回 1

如果无效则返回零

比特币中标准脚本的类型

  1. p2pk (Pay to public key,支付给公钥)
  2. p2pkh (Pay to public key hash,支付给公钥哈希)
  3. p2sh (Pay to script hash,支付给脚本哈希)
  4. p2wpkh (Pay to witness pubkey hash,支付给见证公钥哈希)
  5. p2wsh (Pay to witness script hash,支付给见证脚本哈希)
  6. p2tr (Pay to Taproot,支付给 Taproot)

什么是比特币地址?

比特币地址是标准脚本模板的编码,即它们代表特定的脚本模板

比特币地址只是你可以接收比特币的目的地,比特币地址是基于标准脚本创建的,因此截至今天,有 5 种主要的比特币地址类型,其中 TaprootSegWit (隔离见证) 是基于某些比特币标准的最新和最安全的地址。

最常用的比特币地址是:

  • p2pkh (以 1 开头)
  • p2sh (以 3 开头)
  • p2wpkh (以 bc1q… 开头)
  • p2wsh (以 bc1q… 开头)
  • p2tr (以 bc1p… 开头,2021 年推出,BIP341)

BIP — Bitcoin Improvement proposal,比特币改进提案

传统 (P2PKH, P2SH) 和 SegWit (P2WPKH, P2WSH) 之间的主要区别在于解锁数据的位置:

  • 传统 → 在 scriptSig 中。
  • SegWit → 在 witness 字段中。

从传统地址转移到 SegWit 是因为 SegWit 的结构修复了 延展性 并降低了费用,而传统地址具有这些问题。

交易延展性

交易延展性是更改比特币交易 ID (txid) 而不更改其实际功能的能力。

在 SegWit 之前,txid 是通过对整个交易进行哈希计算来计算的,包括 scriptSig 中的签名数据。由于签名可以用不同但仍然有效的方式进行编码,因此攻击者可以稍微修改签名并生成不同的 txid,即使交易花费了相同的输入并发送到相同的输出。

这导致了问题,因为它使 txid 变得不可预测,破坏了依赖于原始 txid 的后续交易,并阻止了像 闪电网络 这样的协议工作。SegWit 通过将签名从哈希到 txid 的交易部分移出,从而解决了这个问题,因此 txid 仅涵盖基本部分(输入、输出、金额),而包含见证数据的完整交易具有单独的哈希,称为 wtxid

禁用的 OP_CODE

比特币 Script 曾经有很多操作码,但其中几个,例如 OP_MUL,早在 0.3.5 版本就被禁用了,以减少潜在的漏洞。在实践中,只有一小部分 Script 的功能被积极使用,这意味着维护未使用的功能会增加复杂性,而没有太大的好处。因此,简化语言使比特币更加安全,这与其他区块链项目以更大的攻击面为代价扩展其智能合约语言形成对比。

SHA-1 Piñata(彩罐)

Peter Todd 的“SHA-1 Piñata”是 Script 创造性实用性的一个著名例子。2013 年,他将比特币锁定在一个脚本中,如果有人发现 SHA-1 冲突,就可以赎回。当 Google 在 2017 年实现这一点时,这些资金被认领,将一个密码学里程碑变成了一个真实的经济事件。已经为其他散列函数创建了类似的 piñatas,展示了比特币 Script 如何既可以作为一种安全机制,也可以作为一种激励,以促进密码学研究。

结论

Script 仍然是灵活的,可以编写任何任意程序,并且可以用许多不同的方式锁定比特币。但是,如果没有适当的保护措施,例如签名要求,某些脚本可能会使资金容易受到任何可以解决它们的人的攻击。这再次强调了安全 ScriptPubKeys 和工作量证明机制的重要性,该机制确保一旦代币被花费并在一个区块中确认,它们就不能轻易地被重复使用。

工作量证明 (PoW) 机制是一个系统,其中计算机(矿工)竞争以解决一个困难的数学难题。

如果你喜欢此类内容,请保持联系!你可以在 X 上关注我,在 GitHub 上查看我正在构建的内容,并在 LinkedIn 上打个招呼。

  • 原文链接: blog.blockmagnates.com/s...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
blockmagnates
blockmagnates
The New Crypto Publication on The Block