-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
72 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
在比特币交易中,**锁定脚本(Locking Script)** 和 **解锁脚本(Unlocking Script)** 是比特币脚本系统的核心,用来控制资金的转移和验证。 | ||
|
||
### 1. 锁定脚本(Locking Script) | ||
|
||
锁定脚本,也被称为**脚本公钥(scriptPubKey)**,是附加在一个交易输出(UTXO)上的条件,规定了接收资金的条件。锁定脚本规定了想要使用这些资金的人必须满足的条件,比如提供一个有效的数字签名或者其他验证信息。锁定脚本对应交易的输出(Output) | ||
|
||
常见的锁定脚本形式是要求提供接收者的公钥哈希和对应的签名。举个例子,一个典型的 P2PKH(Pay to Public Key Hash)锁定脚本如下: | ||
|
||
```plaintext | ||
OP_DUP OP_HASH160 <公钥哈希> OP_EQUALVERIFY OP_CHECKSIG | ||
``` | ||
|
||
解释: | ||
- `OP_DUP`:复制栈顶的项(通常是提供的公钥)。 | ||
- `OP_HASH160`:对栈顶项进行哈希运算(SHA-256 后接 RIPEMD-160)。 | ||
- `<公钥哈希>`:预先存储的比特币地址(公钥的哈希值)。 | ||
- `OP_EQUALVERIFY`:比较公钥哈希和交易输入提供的公钥的哈希值,验证是否相等。 | ||
- `OP_CHECKSIG`:验证输入脚本中提供的签名是否与对应的公钥匹配。 | ||
|
||
### 2. 解锁脚本(Unlocking Script) | ||
|
||
解锁脚本,也称为**脚本签名(scriptSig)**,是交易输入的一部分,提供了满足锁定脚本的条件,允许资金的使用。它包含执行锁定脚本所需要的信息,比如签名和公钥。解锁脚本的作用是 "解锁" 先前的锁定脚本中设置的限制。解锁脚本对应交易的输入(Input) | ||
|
||
对应上述的 P2PKH 交易,解锁脚本可能是: | ||
|
||
```plaintext | ||
<签名> <公钥> | ||
``` | ||
|
||
解释: | ||
- `<签名>`:发送者对当前交易的签名,证明发送者有权使用资金。 | ||
- `<公钥>`:签名者的公钥,用来在锁定脚本中验证。 | ||
|
||
### 3. 锁定脚本和解锁脚本的执行过程 | ||
|
||
比特币交易的执行是通过将解锁脚本和锁定脚本组合起来,形成一个完整的脚本,称为**脚本栈(Script Stack)**,进行操作。 | ||
|
||
举例: | ||
1. **解锁脚本**会首先被执行,其结果(如签名和公钥)会被压入脚本栈中。 | ||
2. 然后,**锁定脚本**会被执行,它会使用解锁脚本的结果来验证条件是否成立。 | ||
|
||
当栈中所有的操作都成功,且最后的结果为真(True),比特币网络就认为这笔交易是有效的,从而资金可以转移。 | ||
|
||
### 4. 示例:P2PKH(支付到公钥哈希) | ||
|
||
假设 Alice 发送 1 BTC 给 Bob。在这种情况下,Bob 的比特币地址实际上是他公钥的哈希值。交易会包含以下部分: | ||
|
||
- **锁定脚本**(scriptPubKey)附加在 Alice 的交易输出上,表示: | ||
- "Bob 只能通过提供一个与这个公钥哈希对应的有效签名和公钥来花费这笔比特币。" | ||
|
||
锁定脚本形式如下: | ||
```plaintext | ||
OP_DUP OP_HASH160 <Bob的公钥哈希> OP_EQUALVERIFY OP_CHECKSIG | ||
``` | ||
|
||
- **解锁脚本**(scriptSig)是 Bob 创建下一笔交易时提供的脚本,其中包含: | ||
- Bob 的公钥。 | ||
- Bob 对新交易的签名(用他的私钥生成)。 | ||
|
||
解锁脚本形式如下: | ||
```plaintext | ||
<Bob的签名> <Bob的公钥> | ||
``` | ||
|
||
执行时,会将 `<Bob的签名>` 和 `<Bob的公钥>` 压入栈中,然后执行锁定脚本,验证是否满足花费资金的条件。 | ||
|
||
### 5. 总结 | ||
|
||
- **锁定脚本(Locking Script)** 是附加在交易输出(UTXO)上的条件,定义了谁和如何才能使用这笔资金。 | ||
- **解锁脚本(Unlocking Script)** 是用于满足锁定脚本条件的具体数据,如签名和公钥,允许某人花费对应的比特币。 | ||
|
||
锁定和解锁脚本的结合构成了比特币的核心安全机制,使得只有持有私钥的人才能签署交易并转移资金。 |