Locks
交易中的每个输出都有一个锁。这个锁是未来交易中花费该输出所必须满足的一组要求。
换句话说,这些锁可以防止比特币被盗(即其他人花费你的比特币),因为我们收到的每个输出都由一个锁限制。
例如,一个典型的锁看起来像这样:
锁是在什么时候加在输出上的?¶
正如我们所知,交易使用现有的输出并从中创建新的输出:
正是在创建这些输出的过程中,我们为每个输出赋予了它们自己的“锁”:
所以当我们要给朋友发送比特币时,我们创建一个新输出,并添加一个锁,上面写着“只有地址 1friend1234567890... 的拥有者才能使用此输出”:
因此,这个新输出将有效地“属于”我们的朋友,因为他们是唯一拥有解锁锁定到此地址的比特币所需私钥的人,所以没有其他人能够花费它。
比特币存在哪里?¶
你可能已经注意到了,你从未真正把比特币直接从你的电脑“发送”到别人的电脑上。
相反,你是在构建一笔创建新输出(上面带有锁)的交易,将此交易数据发送到比特币网络中,并等待它被开采进区块链中。
所以,尽管区块链是一个交易文件,但在实用层面上,你可以把它看作是输出的存储库。
区块链就是一个巨大的输出存储单元。
当你想要把“你的”比特币发送给某人时,你只需选择区块链中你可以解锁的输出:
而当这笔交易被开采到区块链中后,你用作输入的输出就不能再被使用了。
因此,区块链存储输出,你可以随时花费这些输出中的任何一个(当然,前提是你可以解锁它们)。
锁看起来像什么?¶
锁是用一种被称为 Script 的基础编程语言编写的。
要用一张图表解释整门编程语言的工作原理有点困难,但我们试一下:
这是一个简化版的锁定脚本示例;它不完全是 Script 的真实样子。
现在,这个锁定脚本中最有趣的部分是 CHECKPRIVATEKEY 部分,这是我们用来帮助设置锁要求的一个函数。
所以对于这个特定的输出,我们设置了一个锁,该锁想要将地址 1EUXSxuUVy2PC5enGXR1a3yxbEjNWMHuem 与一个私钥进行比较。
如果我们能为这个锁提供正确的私钥(该地址拥有者保持私密的那一个),我们就可以解锁它并在交易中花费它。
你如何解锁一个锁?¶
当你构建交易数据时,你会在要花费的每个输出旁边包含一个“解锁脚本”:
例如,要解锁一个典型的锁定脚本(例如 [address] CHECKPRIVATEKEY),我们需要证明我们拥有锁内部的地址。为此,我们提供与该地址相连的私钥。
因此,当节点收到此交易数据时,他们将一起运行“锁定”+“解锁”脚本,以查看你的私钥是否在数学上与该地址相连。
如果一切正常,该节点就会接受该交易并将其传递给其他节点,其他节点在接受交易之前也会依次运行“锁定”+“解锁”脚本。
这就是你解锁输出上的锁的方法。
我们这不是在泄露我们的私钥吗?¶
敏锐的观察。
坦白说:我们实际上并没有把我们的私钥放入解锁脚本中。
为了避免我们在交易数据中泄露私钥,我们使用私钥创建了一个被称为数字签名的东西来代替:
显然,关于那个 CHECKPRIVATEKEY 函数我也撒了谎。
然而,确实存在一个比较地址与数字签名的函数,它被称为 CHECKSIG:
多亏了数字签名的数学原理和 CHECKSIG 函数,我们仍然可以将输出锁定到地址,并在不泄露私钥的情况下解锁它们。
太棒了。
在 Script 编程语言中有许多不同的可用函数。CHECKSIG 函数设计用于将输出锁定到特定地址,但你可以使用其他函数(以及进行各种组合)来创建复杂得多的锁。
例如,你可以创建一个只能在特定日期之后解锁的锁,或者一个只能由两个(或更多)不同地址的拥有者共同解锁的锁。
这就是为什么比特币有时被称为“可编程货币”的原因。












