Skip to content

Commit

Permalink
finish basic bitcoin scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
KaKeimei committed Jun 30, 2024
1 parent 3f2fa03 commit 78a0a88
Show file tree
Hide file tree
Showing 6 changed files with 267 additions and 2 deletions.
1 change: 0 additions & 1 deletion docs/contract/metacontract.md

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,71 @@
---
sidebar_position: 5
---

# P2MS(支付到多签)脚本

介绍P2MS输出。

## 什么是P2MS输出?

P2MS(Pay-to-MultiSig,即“支付到多重签名”)是比特币网络中一种允许多个签名者共同管理一笔资金的交易输出类型。这种机制通常用于增加安全性和容错性,例如在多方共管的企业资金账户中。P2MS输出可以指定需要多少个签名者的签名才能花费这笔资金,从而提供灵活的多重签名解决方案。

## P2MS输出的结构

P2MS输出的脚本被称为锁定脚本(scriptPubKey),它的典型结构如下:

```
m <公钥1> <公钥2> ... <公钥n> n OP_CHECKMULTISIG
```

在这个脚本中:

- `m`:表示需要多少个签名才能花费这笔资金(最小签名数)。
- `<公钥1> <公钥2> ... <公钥n>`:这些是参与多重签名的公钥。
- `n`:表示总共有多少个公钥参与(最大签名数)。
- `OP_CHECKMULTISIG`:这是一个操作码,用于验证提供的签名是否满足所需的最小签名数。

为了更好地理解P2MS输出,让我们拆解其脚本:

1. `m`:指定所需的最小签名数。
2. `<公钥1> <公钥2> ... <公钥n>`:提供多个公钥。
3. `n`:指定公钥的总数。
4. `OP_CHECKMULTISIG`:验证签名是否满足`m`个有效签名。

## P2MS输出的特点

1. **增加安全性**:P2MS输出允许多个签名者共同管理一笔资金,减少单点故障的风险。如果一个签名者的私钥泄露,攻击者仍然需要其他签名者的私钥才能花费资金。
2. **灵活性**:P2MS输出可以根据需求设置签名阈值(m)和参与签名的总人数(n)。例如,可以设置3-of-5签名,即需要5个公钥中的任意3个签名才能花费资金。
3. **复杂性**:与P2PKH输出相比,P2MS输出的脚本更复杂,需要更多的计算和验证步骤。虽然增加了安全性,但也增加了使用的复杂性和交易的字节大小。

## P2MS输出的使用场景

P2MS输出在需要多方共管或增强安全性的场景中非常有用。以下是一些典型的使用场景:

1. **企业资金管理**:企业可以使用P2MS输出来设置多重签名账户,确保需要多个授权人签名才能花费公司资金。
2. **联合投资**:多个投资者可以使用P2MS输出共同管理一笔投资资金,只有在达成共识后才能花费。
3. **家庭财务安全**:家庭成员可以设置多重签名账户,确保家庭资金的安全管理。

## P2MS交易的示例

以下是一个P2MS交易的简化示例:

- 锁定脚本(scriptPubKey):
```
2 <公钥1> <公钥2> <公钥3> 3 OP_CHECKMULTISIG
```

- 解锁脚本(scriptSig):
```
OP_0 <签名1> <签名2>
```

当花费这笔比特币时,需要提供解锁脚本,其中包含满足最小签名数的签名。在这个示例中,需要至少两个签名才能花费资金。验证过程如下:

1. `OP_0`:由于比特币脚本中的一个小bug,需要先放一个无效的操作码(通常是`OP_0`)在栈顶。
2. `<签名1> <签名2>`:提供两个有效签名。
3. `OP_CHECKMULTISIG`:从栈中取出签名和公钥,验证是否满足至少两个签名的要求。

## 结论

P2MS输出作为一种允许多重签名验证的交易类型,在比特币网络中提供了增强的安全性和灵活性。它适用于需要多方共管的场景,如企业资金管理、联合投资和家庭财务安全。尽管其脚本结构相对复杂,但P2MS输出的使用可以显著提高资金管理的安全性。理解P2MS输出对于深入掌握比特币的高级用法和多重签名机制具有重要意义。
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,59 @@
sidebar_position: 3
---
# P2PK(支付到公钥)脚本

介绍P2PK输出。

## 什么是P2PK输出?

P2PK(Pay-to-PubKey,即“支付到公钥”)是比特币网络中一种较早的输出类型,用于向特定的公钥进行支付。虽然在现代比特币交易中使用相对较少,但了解P2PK对于理解比特币交易和脚本系统是非常重要的。

### P2PK输出的结构

P2PK输出的结构相对简单,它直接包含了接收方的公钥。典型的P2PK脚本如下:

```
<公钥> OP_CHECKSIG
```

在这个脚本中:

- `<公钥>`:这是接收方的公钥。
- `OP_CHECKSIG`:这是一个操作码,用于验证签名。

为了更好地理解P2PK输出,让我们拆解其脚本:

1. `<公钥>`:这是一个压缩或未压缩的比特币公钥。
2. `OP_CHECKSIG`:这是一个操作码,它会从栈中取出一个签名和一个公钥,然后使用该公钥验证签名是否有效。

### P2PK输出的特点

1. **简单性**:P2PK输出结构简单,只包含一个公钥和一个操作码。这使得它在比特币早期版本中广泛使用。
2. **直接支付到公钥**:不像P2PKH(Pay-to-PubKeyHash)输出需要通过公钥哈希找到公钥,P2PK输出直接使用公钥。这简化了验证过程,但也带来了一些隐私和安全问题。
3. **隐私问题**:由于P2PK输出直接包含公钥,任何人都可以看到接收方的公钥。这可能会导致隐私问题,因为公钥可以通过一定的技术手段被关联到用户的其他交易或身份。
4. **安全问题**:在量子计算机可能威胁到公钥加密的假设下,直接暴露公钥可能会降低安全性,因为量子计算机可能能够从公钥中推导出私钥。

### P2PK输出的使用场景

尽管P2PK输出在现代比特币交易中已经不常见,但它在比特币的早期发展中扮演了重要角色。以下是一些可能的使用场景:

1. **矿工奖励**:比特币创世区块和早期的一些区块使用了P2PK输出作为矿工奖励。
2. **简单的点对点支付**:在比特币早期,用户之间进行简单的点对点支付时可能会使用P2PK输出。

### 现代替代方案

由于P2PK输出的隐私和安全问题,现代比特币交易中更常用的是P2PKH(Pay-to-PubKeyHash)输出和P2SH(Pay-to-ScriptHash)输出。

- **P2PKH**:P2PKH输出使用公钥哈希,而不是直接使用公钥,这样可以在一定程度上保护用户的隐私和安全。典型的P2PKH脚本如下:
```
OP_DUP OP_HASH160 <公钥哈希> OP_EQUALVERIFY OP_CHECKSIG
```

- **P2SH**:P2SH输出允许使用更复杂的脚本,以支持多重签名和其他高级功能。典型的P2SH脚本如下:
```
OP_HASH160 <脚本哈希> OP_EQUAL
```

### 结论

P2PK输出作为比特币网络的一种早期交易输出类型,虽然在现代使用较少,但其简单直接的设计为理解比特币交易和脚本系统提供了一个重要的基础。随着比特币网络的发展,更多复杂和安全的输出类型如P2PKH和P2SH逐渐取代了P2PK输出,但了解P2PK输出对于全面理解比特币技术仍然是非常重要的。
Original file line number Diff line number Diff line change
@@ -1,4 +1,74 @@
---
sidebar_position: 4
---



# P2PKH(支付到公钥哈希)脚本

介绍P2PKH输出。

## 什么是P2PKH输出?

P2PKH(Pay-to-PubKeyHash,即“支付到公钥哈希”)是比特币网络中最常见的一种交易输出类型。它比早期的P2PK(Pay-to-PubKey)输出提供了更好的隐私和安全性。P2PKH输出允许比特币支付给一个公钥哈希,而不是直接支付给公钥,从而在一定程度上保护了接收方的隐私。

## P2PKH输出的结构

P2PKH输出的脚本被称为锁定脚本(scriptPubKey),它的典型结构如下:

```
OP_DUP OP_HASH160 <公钥哈希> OP_EQUALVERIFY OP_CHECKSIG
```

为了理解这个脚本,让我们拆解它的各个部分:

1. **OP_DUP**:复制栈顶元素。
2. **OP_HASH160**:对栈顶元素进行RIPEMD-160哈希运算(之前是SHA-256哈希)。
3. **\<公钥哈希>**:接收方的公钥哈希。
4. **OP_EQUALVERIFY**:验证栈顶的两个元素是否相等,如果不相等,则中止并返回错误。
5. **OP_CHECKSIG**:检查签名是否有效。

在P2PKH交易中,发送方的解锁脚本(scriptSig)需要提供:

1. 签名:证明发送方对这笔交易的授权。
2. 公钥:与锁定脚本中的公钥哈希匹配。

## P2PKH输出的特点

1. **增强的隐私性**:P2PKH输出只包含公钥的哈希值,而不是直接包含公钥。这使得追踪接收方的公钥变得更加困难,从而增强了隐私性。
2. **改进的安全性**:由于直接包含公钥的交易容易受到潜在的量子计算攻击,P2PKH输出通过使用公钥哈希提供了一层额外的安全性。量子计算机要破解哈希值比破解公钥更加困难。
3. **广泛使用**:P2PKH输出是比特币交易中最常见的输出类型,广泛应用于各种交易场景中。
4. **支持轻量级客户端**:P2PKH输出使得轻量级客户端(如SPV钱包)能够更高效地验证交易,因为这些客户端只需要检查公钥哈希,而不是处理完整的公钥。

## P2PKH输出的使用场景

P2PKH输出在比特币网络中被广泛使用,几乎涵盖了所有普通用户的日常交易。以下是一些典型的使用场景:

1. **个人钱包交易**:大多数比特币钱包默认使用P2PKH输出来接收比特币。
2. **商家支付**:许多在线商家和服务提供商使用P2PKH地址来接收客户的比特币支付。
3. **交易所转账**:交易所用户进行比特币充值和提现时,通常使用P2PKH输出。

## P2PKH交易的示例

以下是一个P2PKH交易的简化示例:

- 锁定脚本(scriptPubKey):
```
OP_DUP OP_HASH160 <公钥哈希> OP_EQUALVERIFY OP_CHECKSIG
```

- 解锁脚本(scriptSig):
```
<签名> <公钥>
```

当接收方要花费这笔比特币时,他们需要提供解锁脚本,其中包含一个有效的签名和与公钥哈希匹配的公钥。验证过程如下:

1. `OP_DUP`:复制解锁脚本中的公钥。
2. `OP_HASH160`:对公钥进行哈希运算,生成公钥哈希。
3. `OP_EQUALVERIFY`:验证计算得到的公钥哈希是否与锁定脚本中的公钥哈希匹配。
4. `OP_CHECKSIG`:使用提供的公钥验证签名的有效性。

## 结论

P2PKH输出作为比特币网络中最常见的交易输出类型,提供了增强的隐私和安全性。它的结构使得比特币支付更加安全和隐私,适用于各种交易场景。从个人钱包到商家支付,P2PKH输出在比特币生态系统中扮演了重要角色,推动了比特币的广泛应用和普及。理解P2PKH输出对于深入了解比特币交易机制和提升比特币使用安全性具有重要意义。
Original file line number Diff line number Diff line change
@@ -1,4 +1,78 @@
---
sidebar_position: 6
---

# P2SH(支付到脚本哈希)脚本

## 什么是P2SH输出?

P2SH(Pay-to-Script-Hash,即“支付到脚本哈希”)是比特币网络中一种强大的交易输出类型。它允许将复杂的条件和脚本隐藏在一个哈希值中,只有在实际花费时才需要公开这些脚本。这种机制极大地提高了比特币交易的灵活性和隐私性,同时简化了用户的操作。

## P2SH输出的结构

P2SH输出的锁定脚本(scriptPubKey)与P2PKH(Pay-to-PubKeyHash)输出类似,但它包含一个脚本哈希而不是公钥哈希。典型的P2SH锁定脚本如下:

```
OP_HASH160 <脚本哈希> OP_EQUAL
```

在这个脚本中:

- `OP_HASH160`:对栈顶的元素进行RIPEMD-160哈希运算(先进行SHA-256哈希,然后进行RIPEMD-160哈希)。
- `<脚本哈希>`:这是一个20字节的哈希值,表示锁定脚本的哈希。
- `OP_EQUAL`:检查栈顶的哈希值是否等于提供的脚本哈希。

## P2SH交易的特点

1. **灵活性**:P2SH输出允许使用复杂的脚本和条件,而这些脚本和条件在生成交易时并不需要公开。只有在花费时才需要提供完整的解锁脚本。
2. **隐私性**:由于锁定脚本在生成交易时被哈希隐藏,P2SH输出提高了交易的隐私性。观察者无法从交易输出中直接看到具体的条件和脚本。
3. **简单的地址格式**:P2SH地址以“3”开头,使其与其他类型的比特币地址区别开来。用户只需提供P2SH地址,无需了解背后的复杂脚本。

## P2SH交易的使用场景

P2SH输出在许多需要复杂条件的交易场景中非常有用。以下是一些典型的使用场景:

1. **多重签名**:P2SH输出可以用于多重签名账户,只有满足特定数量的签名者签名后,资金才能被花费。这简化了多重签名的管理。
2. **时间锁定**:P2SH输出可以包含时间锁定条件,使得资金在特定时间之前无法被花费。
3. **条件支付**:P2SH输出可以用于设置复杂的条件支付,如智能合约和去中心化应用(DApps)。

## P2SH交易的示例

以下是一个P2SH交易的简化示例:

1. **锁定脚本(scriptPubKey)**
```
OP_HASH160 <脚本哈希> OP_EQUAL
```

2. **解锁脚本(scriptSig)**
```
<解锁数据> <锁定脚本>
```

在这个示例中,锁定脚本包含一个脚本哈希。在花费时,解锁脚本需要提供满足条件的解锁数据和原始锁定脚本。

## 多重签名P2SH交易示例

假设我们有一个2-of-3的多重签名P2SH交易:

1. **锁定脚本(scriptPubKey)**
```
OP_HASH160 <多重签名脚本哈希> OP_EQUAL
```

2. **多重签名脚本**
```
2 <公钥1> <公钥2> <公钥3> 3 OP_CHECKMULTISIG
```

3. **解锁脚本(scriptSig)**
```
OP_0 <签名1> <签名2> <多重签名脚本>
```

在这个多重签名交易中,锁定脚本只包含多重签名脚本的哈希值。要花费这笔资金,解锁脚本需要提供两个签名和原始的多重签名脚本。

## 结论

P2SH输出是一种灵活且强大的比特币交易输出类型,允许使用复杂的条件和脚本,同时提高了隐私性和安全性。通过将复杂的脚本隐藏在哈希值中,P2SH输出简化了用户的操作,并为各种高级用例(如多重签名和时间锁定)提供了支持。理解P2SH输出对于全面掌握比特币的脚本系统和交易机制具有重要意义。

This file was deleted.

0 comments on commit 78a0a88

Please sign in to comment.