比特币一直都有智能合约

本文介绍了比特币交易的底层原理,重点讲解了比特币中的智能合约(Script),包括其与通用编程语言的区别(非图灵完备、基于栈),以及两种常见的交易脚本类型:P2PKH 和 P2SH,解释了锁定脚本和解锁脚本如何共同工作以实现交易验证,以及比特币智能合约在保证安全性的同时,实现简单和相对复杂的交易。

当我学习比特币底层原理时,我很惊讶地发现比特币具有智能合约,至少在一定程度上是这样。虽然它们相当简单,但这些强大的合约是比特币交易安全性的保障。理解这些脚本的工作方式对于理解 Taproot 的作用也很重要。

比特币交易是被设置和满足的支出条件

起初,了解比特币交易可能会有点令人困惑,所以让我们从区块链开始,那里存储着所有的交易。区块链是一种数据结构,可以像数字账本一样跟踪我们的交易。区块链中的每个区块都包含许多交易。问题是,这些交易是什么样的?通常,在最初解释区块链如何工作时,我们可能会让人觉得它是一堆余额和那些资金所属的伪匿名地址。为了理解比特币交易的真正运作方式,我们必须抛弃这种印象。

让我们来谈谈一个比特币交易是什么样的。每笔交易都可以有多个输入和多个输出。 一笔交易输出仅包含一定数量的比特币(以 satoshis 为单位)和该比特币可以被支出的条件(称为 锁定脚本)。

交易输出有两种类型:未花费交易输出(UTXO)和已花费交易输出(STXO)。UTXO 是其条件尚未得到满足的交易输出。这些条件只能满足一次,因为一旦满足,交易输出就不再是 UTXO,而是不能再被花费的 STXO。

交易输入是 UTXO 如何被花费的。交易输入包含其正在花费的 UTXO 的交易 ID,一个表示其正在花费该交易的哪个 UTXO 的索引(因为,请记住,一笔交易可以有多个带有不同锁定脚本的输出),以及一个 解锁脚本 。解锁脚本的目的只是为了满足先前由其试图花费的锁定脚本设置的条件。

所以你的余额 与你的比特币地址一起存储在区块链上,只存储着多个可由同一私钥花费的 UTXO。比特币钱包可以通过扫描 UTXO 并查看哪些可以被你的私钥赎回来计算你的余额。这些的总和就是你的余额。

让我们深入研究锁定和解锁脚本如何工作,以及不同类型的锁定脚本。

比特币交易是用一种名为 Script 的脚本语言编写的

这种语言与我们现在使用的Many编程语言不同。虽然起初它可能看起来有点奇怪和基本,但就像比特币的其他许多东西一样,它的独特设计有非常好的理由。 Script 和其他语言之间的两个主要区别如下:

  1. 不是图灵完备的
  2. 使用堆栈数据结构

图灵完备 语言是一种可以表达任何可能的程序的语言。这也被认为能够解决任何可能的问题。这里的难点在于你永远无法提前知道程序何时终止。图灵完备语言包括可能运行很长时间的循环。所以虽然它可以解决任何可能的问题,但它假设有无限的内存,并且你无法提前知道运行时。

拥有图灵完备的脚本语言对于比特币来说是有问题的,因为 比特币网络中的每个节点都需要能够验证每笔交易,并且需要可预测的执行时间。所以, Script 不是图灵完备的。它主要包含条件 If…Then…Else 语句,并且没有任何可能引入不可预测运行时的循环或递归。

此外,比特币使用 堆栈 ,一种只能添加到顶部,也只能从顶部移除的数据结构。它被称为先进后出(FILO)的对象访问方法。你可以使用“push”运算符添加到堆栈,该运算符将一个对象添加到堆栈的顶部,并且你可以使用“pop”操作移除对象,该操作移除堆栈顶部的对象。

虽然这在功能方面确实构成了一种原始语言,但它成功地满足了比特币的特殊要求。例如,在一种更广泛使用的编程语言中,如 Python,将两个数字相加通常看起来像这样:

1 + 1

这将返回 2。非常简单,对吧?

使用 Script,这将看起来像:

OP_1 OP_1 OP_ADD

1 被推到堆栈上,然后另一个 1 被推到堆栈上。接下来,运算符“ADD”运行,它从堆栈中弹出两个值,将它们相加,然后将它们的结果推到堆栈上。堆栈上剩下的唯一值是 2,程序终止。

交易脚本的类型

P2PKH

当谈到比特币交易时,有不同类型的交易脚本。最常见的是 Pay-To-Public-Key-Hash(P2PKH),它看起来像这样:

OP_DUP OP_HASH160 <public key hash> OP_EQUALVERIFY OP_CHECKSIG

并且可以使用这个解锁脚本来花费:

<signature> <public key>

那么,这些脚本是如何运行和验证的?如果正在创建一个新的交易,它采用上面显示的锁定脚本,并使用以下解锁脚本来花费它(作为其交易的输入),一个节点可以通过一起运行解锁和锁定脚本来验证它。该节点从交易输入中复制解锁脚本,从输入引用的 UTXO 中复制锁定脚本,然后按顺序执行解锁和锁定脚本,使其看起来像这样:

<signature> <public key> OP_DUP OP_HASH160 <public key hash> OP_EQUALVERIFY OP_CHECKSIG

为了分解它,这个组合脚本有两个关键部分。首先是确保解锁脚本提供的公钥具有等于锁定脚本指定的公钥哈希(公钥哈希等于 SHA-256 哈希的 RIPEMD160 哈希[当这两个哈希按此顺序使用时,也称为 HASH160])的公钥。

第二个关键部分是使用“OP_CHECKSIG”验证签名,它将签名和相应的公钥作为输入,并将一个真或假值推送到堆栈。

P2SH

比特币中另一种常见的交易脚本类型是 Pay-to-Script-Hash(P2SH),它允许多样化的交易格式。使用 P2SH,有一个锁定脚本、解锁脚本和一个赎回脚本。赎回脚本是指定为了花费分配的比特币数量而需要满足的条件的脚本。对于这个例子,让我们假设这是我们的赎回脚本:

<3> <Public Key 1> <Public Key 2> <Public Key 3> <Public Key 4> <4> OP_CHECKMULTISIG

OP_CHECKMULTISIG 允许我们拥有多重签名交易。这些是具有多个有效公钥的交易,可以花费该交易,以及成功花费它所需的指定数量的不同签名。在上面的赎回脚本中,有 4 个有效的交易签名者,并且只需要 3 个交易就可以花费资金。这使得它被称为 3-of-4 多重签名。

另一方面,锁定脚本不包含这些条件。相反,它是一个带有赎回脚本的 HASH160 的脚本。它看起来像这样:

OP_HASH160 <hash of redeem script> OP_EQUAL

这个锁定脚本说解锁脚本必须提供赎回脚本,然后对其进行哈希处理以确认正在满足设置的相同条件,同时实际满足赎回脚本设置的条件。UTXO 不包含赎回脚本,只包含它的哈希,因此得名“Pay-to-Script-Hash”。

解锁脚本看起来像这样:

<Signature 1> <Signature 2> <Signature 3> <<3> <Public Key 1> <Public Key 2> <Public Key 3> <Public Key 4> <4> OP_CHECKMULTISIG>

这看起来很长,但它本质上只是提供赎回脚本以及为了使其结果为 TRUE 所需的签名,从而允许你花费该交易。

这意味着将解锁脚本与锁定脚本一起运行看起来像:

<Signature 1> <Signature 2> <Signature 3> <<3> <Public Key 1> <Public Key 2> <Public Key 3> <Public Key 4> <4> OP_CHECKMULTISIG> OP_HASH160 <hash of redeem script> OP_EQUAL

以下是它的工作原理的分解:

P2SH 比 P2PKH 更灵活,因为赎回脚本可以有很多可能性。

虽然不像用 Solidity 编写的以太坊智能合约那样灵活,以太坊智能合约是图灵完备的且用途更广泛,但比特币的有限智能合约 允许简单和一些复杂的交易,并强调安全性!

来源 & 有用的资源

掌握比特币,第 6 章和第 7 章

比特币维基:脚本

高级比特币脚本 - 第 1 部分:交易和多重签名

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

0 条评论

请先 登录 后评论
ishaana-misra
ishaana-misra
江湖只有他的大名,没有他的介绍。