Skip to content

Locks

Loading Tool

交易中的每个输出都有一个锁。这个锁是未来交易中花费该输出所必须满足的一组要求

换句话说,这些锁可以防止比特币被盗(即其他人花费你的比特币),因为我们收到的每个输出都由一个锁限制

例如,一个典型的锁看起来像这样:

展示放置在交易输出上的简单锁的图表。

锁是在什么时候加在输出上的?

正如我们所知,交易使用现有的输出并从中创建新的输出:

展示包含输入和输出的简单交易图表。

正是在创建这些输出的过程中,我们为每个输出赋予了它们自己的“锁”:

展示包含输入和输出,且输出上带有锁的简单交易图表。

所以当我们要给朋友发送比特币时,我们创建一个新输出,并添加一个锁,上面写着“只有地址 1friend1234567890... 的拥有者才能使用此输出”:

展示输出锁定到具体地址的简单交易图表。

因此,这个新输出将有效地“属于”我们的朋友,因为他们是唯一拥有解锁锁定到此地址的比特币所需私钥的人,所以没有其他人能够花费它。

比特币存在哪里?

你可能已经注意到了,你从未真正把比特币直接从你的电脑“发送”到别人的电脑上。

相反,你是在构建一笔创建新输出(上面带有锁)的交易,将此交易数据发送到比特币网络中,并等待它被开采进区块链中。

展示一笔包含输入和输出的交易被开采进区块链的图表。

所以,尽管区块链是一个交易文件,但在实用层面上,你可以把它看作是输出的存储库

展示区块链中区块内部各个输出的图表。

区块链就是一个巨大的输出存储单元。

当你想要把“你的”比特币发送给某人时,你只需选择区块链中你可以解锁的输出:

展示交易选择区块链中输出的图表。

而当这笔交易被开采到区块链中后,你用作输入的输出就不能再被使用了。

展示一笔交易花费现有输出并将新输出添加到区块链的图表。

因此,区块链存储输出,你可以随时花费这些输出中的任何一个(当然,前提是你可以解锁它们)。

锁看起来像什么?

锁是用一种被称为 Script 的基础编程语言编写的。

要用一张图表解释整门编程语言的工作原理有点困难,但我们试一下:

展示输出上锁定脚本示例的图表。

这是一个简化版的锁定脚本示例;它不完全是 Script 的真实样子。

现在,这个锁定脚本中最有趣的部分是 CHECKPRIVATEKEY 部分,这是我们用来帮助设置锁要求的一个函数

所以对于这个特定的输出,我们设置了一个锁,该锁想要将地址 1EUXSxuUVy2PC5enGXR1a3yxbEjNWMHuem 与一个私钥进行比较。

如果我们能为这个锁提供正确的私钥(该地址拥有者保持私密的那一个),我们就可以解锁它并在交易中花费它。

你如何解锁一个锁?

当你构建交易数据时,你会在要花费的每个输出旁边包含一个“解锁脚本”:

展示交易输入旁的解锁脚本图表。

例如,要解锁一个典型的锁定脚本(例如 [address] CHECKPRIVATEKEY),我们需要证明我们拥有锁内部的地址。为此,我们提供与该地址相连的私钥。

展示放入交易输入解锁脚本中私钥的图表。

因此,当节点收到此交易数据时,他们将一起运行“锁定”+“解锁”脚本,以查看你的私钥是否在数学上与该地址相连。

展示锁定和解锁脚本计算为真的图表。

如果一切正常,该节点就会接受该交易并将其传递给其他节点,其他节点在接受交易之前也会依次运行“锁定”+“解锁”脚本。

这就是你解锁输出上的锁的方法。

我们这不是在泄露我们的私钥吗?

敏锐的观察。

坦白说:我们实际上并没有把我们的私钥放入解锁脚本中。

为了避免我们在交易数据中泄露私钥,我们使用私钥创建了一个被称为数字签名的东西来代替:

展示由私钥创建数字签名并放入解锁脚本的图表。

显然,关于那个 CHECKPRIVATEKEY 函数我也撒了谎。

然而,确实存在一个比较地址与数字签名的函数,它被称为 CHECKSIG

展示数字签名解锁交易输入的图表。

多亏了数字签名的数学原理和 CHECKSIG 函数,我们仍然可以将输出锁定到地址,并在不泄露私钥的情况下解锁它们。

太棒了。

Script 编程语言中有许多不同的可用函数。CHECKSIG 函数设计用于将输出锁定到特定地址,但你可以使用其他函数(以及进行各种组合)来创建复杂得多的锁。

例如,你可以创建一个只能在特定日期之后解锁的锁,或者一个只能由两个(或更多)不同地址的拥有者共同解锁的锁。

这就是为什么比特币有时被称为“可编程货币”的原因。