本文介绍了比特币的脚本语言Script,它是一种基于堆栈的语言,用于验证交易的安全性,解释了Script的工作原理,包括ScriptPubKey和ScriptSig的概念,以及如何使用OP_CODE进行验证, 另外,还介绍了常见的比特币地址类型,以及SegWit如何修复延展性问题,提高交易安全性,同时,还提到了为了安全,比特币禁用了某些OP_CODE。
你知道比特币在每笔交易中都隐藏着自己的编程语言吗?它被称为 Script,虽然它看起来不像我们通常使用的编程语言,但它默默地支持着比特币在网络上的安全转移。在这篇文章中,我将用简单的术语分解 Script,它做什么,为什么它避免某些功能,以及它如何保证比特币的安全。
安全地锁定和解锁代币的能力是我们用来转移比特币的机制,而实现这一点的语言称为 Script。 Script 是一种基于堆栈的语言,类似于 Forth,比特币使用它来安全地验证交易,并确保在将其挖掘到区块链上之前已正确授权。
我之前提到过,比特币避免某些技术标准,其中之一是 图灵完备性。
编程语言中的图灵完备性本质上意味着该程序具有循环的能力,并且我们知道循环在编程中是有用的。
在编写 Script 语言时,有意省略了图灵完备性。这是因为任何人(我的意思是任何具有正确技术知识的人)都可以创建一个 Script 程序,比特币网络上的每个完整节点都将执行该程序。
考虑到这一点,如果有人意外或故意导致循环持续运行,这将本质上创建一个 拒绝服务 (DoS) 攻击。一个带有无限循环的 Script 程序可能会使比特币瘫痪,这将是一个很大的系统漏洞,因此为了确保这种情况不会发生,比特币的智能合约语言避免了图灵完备性。
使用 Script 在比特币中验证交易的基础是结合以下 2 个独立的脚本:
Script 像大多数编程语言一样,一次处理一个命令,而命令只能是以下两种之一:元素 或 操作。
操作通常被称为 OP_CODE(操作码)。每个 OP_CODE 代表比特币 Script 解释器的特定指令。一些 OP_CODE 将数据/元素推送到堆栈,而另一些则操作堆栈并执行检查。请注意,当 Script 处理命令时,它会将命令推送到 堆栈。
堆栈按照先进后出的原则运行
为了使脚本在堆栈中有效,堆栈中的最后一个元素必须是 1
元素的例子包括:
比特币操作码的例子包括:
这是一个将被推入堆栈的脚本示例。
签名 Signature 已被推入堆栈。
<pubkey> — 公钥已被推入堆栈
OP_CHECKSIG — 使用公钥验证签名,如果有效则返回 1
如果无效则返回零
比特币地址是标准脚本模板的编码,即它们代表特定的脚本模板
比特币地址只是你可以接收比特币的目的地,比特币地址是基于标准脚本创建的,因此截至今天,有 5 种主要的比特币地址类型,其中 Taproot 和 SegWit (隔离见证) 是基于某些比特币标准的最新和最安全的地址。
最常用的比特币地址是:
BIP — Bitcoin Improvement proposal,比特币改进提案
传统 (P2PKH, P2SH) 和 SegWit (P2WPKH, P2WSH) 之间的主要区别在于解锁数据的位置:
从传统地址转移到 SegWit 是因为 SegWit 的结构修复了 延展性 并降低了费用,而传统地址具有这些问题。
交易延展性是更改比特币交易 ID (txid) 而不更改其实际功能的能力。
在 SegWit 之前,txid 是通过对整个交易进行哈希计算来计算的,包括 scriptSig 中的签名数据。由于签名可以用不同但仍然有效的方式进行编码,因此攻击者可以稍微修改签名并生成不同的 txid,即使交易花费了相同的输入并发送到相同的输出。
这导致了问题,因为它使 txid 变得不可预测,破坏了依赖于原始 txid 的后续交易,并阻止了像 闪电网络 这样的协议工作。SegWit 通过将签名从哈希到 txid 的交易部分移出,从而解决了这个问题,因此 txid 仅涵盖基本部分(输入、输出、金额),而包含见证数据的完整交易具有单独的哈希,称为 wtxid。
比特币 Script 曾经有很多操作码,但其中几个,例如 OP_MUL
,早在 0.3.5 版本就被禁用了,以减少潜在的漏洞。在实践中,只有一小部分 Script 的功能被积极使用,这意味着维护未使用的功能会增加复杂性,而没有太大的好处。因此,简化语言使比特币更加安全,这与其他区块链项目以更大的攻击面为代价扩展其智能合约语言形成对比。
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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!